Как преобразовать символ в 7 бит, даже паритет в php

Я хочу преобразовать символ в 7 бит даже четности. Можете ли вы предложить мне, как это реализовать?

2
10 дек. '09 в 18:59
источник поделиться
3 ответов

Слишком плохо, что вы не можете использовать инструкцию x86 JPO (Jump if Parity Odd); -)

В зависимости от объема данных, которые вы хотите обработать, может быть быстрее, если вы сначала настроили таблицу трансляции, чем для проверки/обработки символа символом.

$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);
}

(вы можете протестировать этот код полностью, я не знаю)
а затем используйте strtr() для перевода с ascii7 на ascii7-evenbit.

$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])));
}
2
10 дек. '09 в 19:55
источник

Здесь версия C:

uint8_t even_parity (uint8_t b)
{
    return b ^ ((3459840 >> ((b ^ (b >> 4)) & 15)) & 128);
}

Я уверен, что перевод на PHP будет легким, но я буду избегать смущения.

Вдохновленный этот бит Twiddling Hack.

1
11 дек. '09 в 6:06
источник

При риске downvotes:

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";

Это будет считать 1 и добавить дополнительный 1 (если нечетный) или 0 (если четный) в первый бит. Затем скопируйте остальные 7 бит в ответ. Это оставит вам строковое представление 7 бит, даже четность байта.

Для тех более опытных, чем я, это выглядит правильно? Пример вывода:

11111111

01000001

00111010

10111011

0
10 дек. '09 в 19:28
источник

Посмотрите другие вопросы по меткам или Задайте вопрос