Wie man einen Charakter in 7 Bit sogar Parität in PHP umwandelt
-
18-09-2019 - |
Frage
Ich möchte einen Charakter in eine 7 -Bit -gleiche Parität umwandeln. Können Sie mir bitte vorschlagen, wie Sie dies implementieren können?
Lösung
Schade, dass Sie die X86 JPO-Anweisung nicht verwenden können (Sprung, wenn Parität ungerade) ;-)
Abhängig von der Datenmenge, die Sie verarbeiten möchten, ist dies möglicherweise schneller, wenn Sie zum ersten Mal eine Übersetzungstabelle einrichten, als das Zeichen mit dem Zeichen zu überprüfen/zu behandeln.
$map = array();
for($char=0; $char<128; $char++) {
$parity = 0;
for($bit=0; $bit<8; $bit++) {
if($char & (1<<$bit)) {
$parity ^= 128;
}
}
$map[chr($char)] = chr($char|$parity);
}
(Vielleicht möchten Sie diesen Code gründlich testen, habe ich nicht)
und dann verwenden Strtr () von ASCII7 nach ASCII7-Evenbit übersetzt.
$input = 'mary had a little lamb'; // all characters must be within the ascii7 range
$evenbit = strtr($input, $map);
// test output
for($i=0; $i<strlen($evenbit); $i++) {
printf("%08s\n", decbin(ord($evenbit[$i])));
}
Andere Tipps
Hier ist eine C -Version:
uint8_t even_parity (uint8_t b)
{
return b ^ ((3459840 >> ((b ^ (b >> 4)) & 15)) & 128);
}
Ich bin mir sicher, dass die Übersetzung zu PHP einfach sein würde, aber ich werde es vermeiden, mich selbst zu peinlich.
Inspiriert von Dieser ein bisschen twiddelnde Hack.
Auf das Risiko von Downtites:
function to7BitEven($byte) {
if( $byte > 0x7f ) return 0;
$binary = decbin($byte);
$one = 0;
$ret = 0;
for($x=0;$x<strlen($binary);$x++) {
if( $binary[$x] == '1' ) $one++;
}
if( $one % 2 != 0 ) $ret = "1";
else $ret = "0";
for($x=0;$x<(7-strlen($binary));$x++)
$ret .= "0";
$ret .= $binary;
return $ret;
}
echo to7BitEven(0x7f) . "\n";
echo to7BitEven(0x41) . "\n";
echo to7BitEven(0x3a) . "\n";
echo to7BitEven(0x3b) . "\n";
Dies zählt die 1 und fügt dem ersten Bit eine zusätzliche 1 (falls ungerade) oder 0 (falls) hinzu. Kopieren Sie dann die anderen 7 Bit in die Rückgabe. Dadurch werden Sie eine String -Darstellung des 7 -Bits, sogar Parität des Byte, hinterlassen.
Zu den erfahreneren als ich, sieht das richtig aus? Beispielausgabe:
11111111
01000001
00111010
10111011