【问题标题】:how to convert a character to 7 bit even parity in php如何在php中将字符转换为7位偶校验
【发布时间】:2010-12-25 07:36:22
【问题描述】:

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

【问题讨论】:

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


    【解决方案1】:

    有被否决的风险:

    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

    【讨论】:

      【解决方案2】:

      太糟糕了,您不能使用 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])));
      }
      

      【讨论】:

      • 非常感谢 :) 它工作正常.. 现在我正试图明智地做相反的事情...将 7 位偶数奇偶校验转换为字符串..
      【解决方案3】:

      这是一个 C 版本:

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

      我相信翻译成 PHP 会很容易,但我会避免让自己尴尬。

      灵感来自this Bit Twiddling Hack

      【讨论】:

        猜你喜欢
        • 2012-04-20
        • 2012-02-28
        • 1970-01-01
        • 2015-06-29
        • 1970-01-01
        • 1970-01-01
        • 2010-09-12
        • 2015-06-05
        • 2010-09-13
        相关资源
        最近更新 更多