VB6 - Bits in Bytes umrechnern Im Unterforum Hardware, Betriebssysteme, Programmiersprachen - Beschreibung: Alles zu Software, Hardware, Windows, Linux, Programmiersprachen
Anfragen zu Modding, Games, Cracks, etc. unerwünscht.
Elektronik- und Elektroforum Forum Index >>
Hardware, Betriebssysteme, Programmiersprachen
Hardware, Betriebssysteme, Programmiersprachen : Alles zu Software, Hardware, Windows, Linux, Programmiersprachen
Anfragen zu Modding, Games, Cracks, etc. unerwünscht. |
Autor |
VB6 - Bits in Bytes umrechnern |
|
|
|
|
BID = 665221
Endhülse Neu hier
Beiträge: 38 Wohnort: Nms
|
|
Hallo.
Ich möchte von meinen (XP) Rechner Daten an ein C-Control übertragen.
Also: Ich habe 8 Bits (zB. 01010101) die ich in ein Byte (0-255) umrechnern möchte. Das Byte sende ich dann an die C-Control (das Senden klappt).
Aus dem WWWeb habe ich mir schon einige Anregungen geholt.
Zum Beispiel:
for n = 0 to 7_______________________' Schleife 0-7 also 8
EINBYTE = BITFOLGE and (2^n)_______' die einzelnen Bits werden zu Byts
ERGEBNIS = ERGEBNIS + EINBYTE__' alles addieren
Next n_____________________________' Schleife schleifen
Legende:
EINBYTE = Bytewert pro Bit
BITFOLGE = die 8 Bits die umzurechnern sind
ERGEBNIS = der berechnerte Bytewert (8Bits)
das merkwürdige an diesem Code ist, das die Umrechnung von Bit 0,1,4
korrekt ausgeführt wird. Aber bit 3 als 10 ausgegeben wird, obwohl es ja eine 4 sein soll.
Wer sieht den Fehler?!
Ich programmiere mit Visual Basic 6 (VB6) unter XP.
In freudiger Erwartung...
|
|
BID = 665228
kreation91 Gelegenheitsposter
Beiträge: 62
|
|
Hi, soll das heißen das bei dir 2^3 = 10 dezimal ergibt?
|
|
BID = 665260
clembra Inventar
Beiträge: 5404 Wohnort: Weeze / Niederrhein
|
Was steht denn in BITFOLGE am Anfang? Ist das ein 8stelliger String mit 1 und 0? In dem Fall kann es so nicht gehen.
Ersetze die Zeile mal durch folgende:
EINBYTE = Mid(BITFOLGE, 7-n, 1) * (2^n)
Und baue ein paar debug.print ein, um zu sehen, dass auch die Zwischenschritte richtig rechnen. Bei deiner jetzigen Formel halte ich korrekte Ergebnisse ehr für Zufall
_________________
Reboot oder be root, das ist hier die Frage.
|
BID = 665294
Endhülse Neu hier
Beiträge: 38 Wohnort: Nms
|
Hallo.
danke für die schnelle Hilfe!!!
@clembra
EINBYTE = Mid(BITFOLGE, 7-n, 1) * (2^n)
...wenn ich die 7 in der obrigen Zeile gegen eine 8 tausche funktioniert es!!!!
Kann ich Bytes genausoleicht in Bits umrechern?
Gruß
|
BID = 665319
DonComi Inventar
Beiträge: 8605 Wohnort: Amerika
|
Moment mal.
Warum der Aufwand? Woher kommen die Daten als 0-1-String?? Welches Programm gibt denn sowas aus??
Die laufenden Zweierpotenzen sind zwar mathematisch völlig korrekt, ergeben aber in diesem Zusammenhang kaum Sinn. Dazu nimmt man besser reine Multiplikationen mit 2 (Schiebeoperation).
Das 2^n ist mathematisch ja völlig richtig, bemüht aber intern Gleitpunktrechnung, was hier völlig überflüssig ist.
Die "Umwandlung" von Byte in einen 1-0-String erfolgt analog. Mit UND kann herausgefunden werden, ob an einer bestimmten Stelle ein Bit gesetzt ist, im String wird dies mit einer "1" oder "0" bewertet und dann schiebt man alle Bits im Byte eine Stelle nach links oder rechts, je nach dem, welches Bit man abfragt.
Beispiel:
Byte input_byte
String Bits
Char(Bits, "0", 8 )
Byte i
For i = 0 To 7 Step 1
If(input_byte And &H80) Then
Mid(Bits, i, 1) = "1" ' *
End If
input_byte = input_byte * 2
End For
Immer noch ein Wahnsinn an Ressourcenverbrauch, wenn man sich den erzeugten Maschinenkode anschauen würde.
Mit Mid(Bits, i, 1) wird glaube ich das entsprechende Zeichen an der i-ten Stelle in den String geschrieben. Ich kenne mich mit BASIC aber nicht mehr gut aus, ist Jaaahre her.
Char(Bits, "0", 8 ) müsste es auch geben, füllt den String mit Nullen auf, und zwar die ersten 8 Stellen.
Edit:
(*) gilt so nur, wenn der String beim Index 0 beginnt. Ansonsten von i=1 bis 8 laufen.
Nochmal: hier werden keine Bits in Bytes umgerechnet! Hier wird eine Zeichenkette, die nur 1 oder 0 enthält in eine gewichtete Binärzahl umgerechnet.
Schildere doch mal, wo die 1-0-Strings herkommen? Vielleicht kann man sich das alles sparen, wenn man an einer anderen Stelle ordentlicher arbeitet.
_________________
[ Diese Nachricht wurde geändert von: DonComi am 23 Jan 2010 18:24 ]
|
BID = 665333
clembra Inventar
Beiträge: 5404 Wohnort: Weeze / Niederrhein
|
Dem Kommentar von Endhülse oben zufolge fängt VB bei 1 an, dass das auch überall anders ist
Also eine allgemeine Funktion hatte ich mal (zu Windows-Zeiten, lange her), die sah etwa wie folgt aus (Syntaxfehler inbegriffen). Diese Methoden haben den Vorteil, dass sie auch funktionieren, wenn der Bitstring mal nicht genau 8 Zeichen lang ist. Hauptsächlich verwendet hatte ich die aber nur für irgendwelche Ein/Ausgabefunktionen.
Code : |
Public Function BinToDec(BinString As String) As Integer 's.u.
Dim Return as Byte ' bzw. Int. bei bis zu 15 Bits und Long bei 16 und mehr Bits
Dim I As Byte
Return = 0
For I = Len(Bitstring) To 1 Step -1
If Mid(BinString, I, 1) = "1" Then
Return = Return + 1
End If
Return = Return * 2
Next
BinToDec = Return
End Function
Public Function DecToBin(DecNumber As Integer) As String 's.u.
Dim Return as String
Dim I As Byte
Dim Test as Integer
Return = ""
Test = 1
While (DecNumber)
If DecNumber And Test Then
Return = "1" & Return
DecNumber = DecNumber - Test
Else
Return = "0" & Return
End If
Test = Test * 2
Wend
DecToBin = Return
End Function
|
|
Aber das sind auch nur Funktionen für "Notfälle", normalerweise ist es klüger direkt mit Zahlwerten, also den Typen Byte, Integer, Long, etc. zu rechnen.
_________________
Reboot oder be root, das ist hier die Frage.
|
BID = 665338
DonComi Inventar
Beiträge: 8605 Wohnort: Amerika
|
Ich habe hier das Gefühl, dass z.B. Checkbox-Zustände übertragen werden sollen und die Zustände durch Einsen und Nullen in einer Zeichenkette repräsentiert werden.
Sollte dem so sein, ließe sich das auch wesentlich einfacher machen, wenn man, wie Clembra andeutete, direkt Ganzzahlen dafür verwendet, indem man gezielt Bits setzt oder löscht.
Bits löscht man mit UND, setzen mit ODER.
Jeder Prozessor kann das i.d.R. mit einer Instruktion ausführen.
_________________
|
BID = 665462
Endhülse Neu hier
Beiträge: 38 Wohnort: Nms
|
Hallo.
Was ich grundsätzlich möchte:
Ich möchte Daten von der C-Control lesen bzw vom Pc senden.
Das bedeutet das ich in VB acht Schalter habe die ich halt Ein bzw Aus schalten kann.
Außerdem möchte ich Analogwerte senden/empfangen (0-255).
Also sind die acht Schalter meine acht Bits.
(Das/die Analogsignal/e werden danach gesendet (auch als Byte).)
Da nun die Analogwerte eh als Byte gesendet werden, dachte ich das ich die 8 Bits der Schalterstellung auch als Byte sende.
...
eure Meinung?
|
BID = 665482
DonComi Inventar
Beiträge: 8605 Wohnort: Amerika
|
Moin Endhülse!
Genau das hatte ich mir gedacht.
Der Umweg über eine Zeichenkette ist überflüssig, du kannst doch Bits direkt in einer Variablen des Types BYTE setzen oder zurücksetzen, wie du willst.
Gehe wie folgt vor:
1. lege eine globale Variable des Typs BYTE an, setzte sie und alle Schalter auf 0.
2. in den Events, die ausgeführt werden, wenn der korrespondierende Schalter gedrückt wird, setzt du in dieser Variablen das entsprechende Bit. Wird Schalter 4 gedrückt, dann setzt du in der Variablen das Bit 3 mit
Var = Var OR &H8
.
Soll nun der Status der acht Schalter übertragen werden, brauchst du bloß diese globale Variable zu übertragen.
Entsprechend gehst du vor, wenn der Schalter ausgeschaltet wird. Mit einem UND kann man gezielt Bits löschen, z.B. in diesem Fall:
Var = Var AND (&HFF - &H8)
.
Schaue dir zum besseren Verständnis an, wie die gewichtete Binärkodierung funktioniert. Man beginnt in diesem Bereich eigentlich immer bei 0 an zu zählen, das unterscheidet Informatiker von Mathematikern (wobei die Informatik ja aus der Mathematik hervorging).
Meine Meinung?
Visual BASIC abstrahiert soo stark, dass der Programmierer offensichtlich keine große Ahnung mehr haben muss. Leider.
_________________
[ Diese Nachricht wurde geändert von: DonComi am 24 Jan 2010 14:19 ]
|
BID = 666311
Endhülse Neu hier
Beiträge: 38 Wohnort: Nms
|
Danke für eure Hilfe!!!
@DonComi
Das hört und sieht interessant aus... damit werde ich mich mal beschäftigen.
bis demnächst...
|
|
Zum Ersatzteileshop
Bezeichnungen von Produkten, Abbildungen und Logos , die in diesem Forum oder im Shop verwendet werden, sind Eigentum des entsprechenden Herstellers oder Besitzers. Diese dienen lediglich zur Identifikation!
Impressum
Datenschutz
Copyright © Baldur Brock Fernsehtechnik und Versand Ersatzteile in Heilbronn Deutschland
gerechnet auf die letzten 30 Tage haben wir 20 Beiträge im Durchschnitt pro Tag heute wurden bisher 4 Beiträge verfasst © x sparkkelsputz Besucher : 182426891 Heute : 850 Gestern : 5094 Online : 387 30.11.2024 7:44 2 Besucher in den letzten 60 Sekunden alle 30.00 Sekunden ein neuer Besucher ---- logout ----viewtopic ---- logout ----
|
xcvb
ycvb
0.0948779582977
|