wallnerm
16-05-2006, 19:59
Hallo,
versuch gerade einen hexadezimalen String in binär umzuwandeln und dann die binären Nibbles auszuwerten:
Folgender hex-String ist gegeben: "F03C"
Wenn man das in binär umwandelt ergibt das lt. Taschenrechner: 1111000000111100
Habe mit folgendem den String erst mal in hex gewandelt:
$in_bitmap_bin = pack("H*", $in_bitmap);
Wie kann ich nun am besten auswerten, welche Bits gesetzt sind. Gehen wir mal davon aus, dass es rechts mit 1 beginnt.
Also:
1 -> nicht gesetzt
2 -> nicht gesetzt
3 -> gesetzt
4 -> gesetzt
usw.
Wer kann mir helfen ??
dankeschön
Original geschrieben von wallnerm
Wie kann ich nun am besten auswerten, welche Bits gesetzt sind.
$binaerString = '1111000000111100';
for($i=0,$l=strlen($binaerString); $i<$l; $i++) {
echo 'Bit '.($l-$i).' ist'.($binaerString{$i} ? '' : ' nicht')." gesetzt<br />\n";
}
wallnerm
16-05-2006, 20:47
Hab das jetzt übernommen. wenn man den binären string vorgibt gehts, aber bei der Wandlung hex in bin stimmt noch was nicht.
// in binär wandeln
$in_bitmap_bin = pack("H*", "F03C");
// Schleife
for($i=0,$l=strlen($in_bitmap_bin); $i<$l; $i++)
{
echo 'Bit '.($l-$i).' ist'.($in_bitmap_bin{$i} ? '' : ' nicht')." gesetzt<br />\n";
}
Hier kommt dann:
Bit 2 ist gesetzt
Bit 1 ist gesetzt
heraus.
Das stimmt ja allein von der Länge strlen nicht. 4 Hexzeichen müssen ja 16 Bits geben.
hallo?! noch nie was von bit operatoren gehört?!
also mal ehrlich! diese methode gehört verboten! (sorry)
function bitisset($num, &$field) {
return ($field & (1 << ($num - 1)));
}
gibt true zurück wenn das $num-te bit in $field gesetzt is sonst natürlich false.
ob man der funktion jetzt ne hexzahl übergibt oder ne dezimal is egal.
aber achtung: hexzahl ist nicht hexstring!
wallnerm
16-05-2006, 22:01
hab leider noch nie was mit binären daten oder konvertierungen gemacht.
Je praktischer die Lösung umso besser:
Wie geht das denn dann mit Strings ?
Es fehlt mir dann immer noch an den Konvertierungen
// Funktionsdefinition für bitisset
function bitisset($num, &$field) {
return ($field & (1 << ($num - 1)));
}
// Ursprungsstring
$in_message = "0350F03C000020808081F0F74"
// bitmap wird aus dem Ursprunsstring geholt ab F03C...
$in_bitmap = substr($in_message,4 , 16);
// Feststellen welche Bits gesetzt sind im ersten Halbbyte
echo bitisset(1, $in_bitmap);
// Funktionsdefinition für bitisset
function bitisset($num, &$field) {
return ($field & (1 << ($num - 1)));
}
// Ursprungsstring
$in_message = "0350F03C000020808081F0F74"
// bitmap wird aus dem Ursprunsstring geholt ab F03C...
$in_bitmap = substr($in_message,4 , 16);
// hex in dezimal konvertieren
$in_bitmap = base_convert($in_bitmap, 16, 10);
// Feststellen welche Bits gesetzt sind im ersten Halbbyte
echo bitisset(1, $in_bitmap);
aber was willst du eigendlich machen?
Original geschrieben von MarkusW
hallo?! noch nie was von bit operatoren gehört?!
Doch, klar.
aber achtung: hexzahl ist nicht hexstring!
Eben deshalb hatte ich mein Beispiel ja so gewählt - weil ich davon ausging, dass er wirklich mit seinem Binärstring weiterarbeiten will ...