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 Forum Nicht eingeloggt       Einloggen       Registrieren




[Registrieren]      --     [FAQ]      --     [ Einen Link auf Ihrer Homepage zum Forum]      --     [ Themen kostenlos per RSS in ihre Homepage einbauen]      --     [Einloggen]

Suchen


Serverzeit: 30 11 2024  07:44:29      TV   VCR Aufnahme   TFT   CRT-Monitor   Netzteile   LED-FAQ   Osziloskop-Schirmbilder            


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
ICQ Status  

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
ICQ Status  

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...


Zurück zur Seite 1 im Unterforum          Vorheriges Thema Nächstes Thema 


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