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?

War es hilfreich?

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

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top