如何在php中将字符转换为7位偶校验

时间:2009-12-10 15:59:57

标签: php algorithm character-encoding parity 7-bit

我想将Character转换为7位偶校验。你能建议我,如何实现这个?

3 个答案:

答案 0 :(得分:3)

太糟糕了,你不能使用x86 JPO指令(如果奇偶校验奇数跳转); - )

根据您要处理的数据量,如果您首先设置转换表而不是逐个字符地检查/处理,则可能会更快。

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

答案 1 :(得分:1)

这是一个C版本:

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

我确信PHP的翻译很简单,但我会避免让自己感到尴尬。

this Bit Twiddling Hack的启发。

答案 2 :(得分:0)

存在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