将 CRC 算法从 C 翻译成 PHP
Translate CRC alrgorythm from C to PHP
已解决
我在 C 上有以下代码,我必须在 PHP
上编写它
const U16 crc_table[16] = {
0x0000, 0x1021, 0x2042, 0x3063, 0x4084, 0x50a5, 0x60c6, 0x70e7,
0x8108, 0x9129, 0xa14a, 0xb16b, 0xc18c, 0xd1ad, 0xe1ce, 0xf1ef
};
U16 CalculateCrc(char *data, U32 len) {
U32 i;
U16 crc = 0;
while (len--) {
i = (crc >> 12) ^ (*data >> 4);
crc = crc_table[i & 0x0F] ^ (crc << 4);
i = (crc >> 12) ^ (*data >> 0);
crc = crc_table[i & 0x0F] ^ (crc << 4);
data++;
}
return (crc & 0xFFFF);
}
在基本的逻辑翻译中,到目前为止我是这样做的:
public function crc($data){
$i = 0;
$crc = 0;
/* @var $crc_table array */
$crc_table = array
(
0x0000, 0x1021, 0x2042, 0x3063, 0x4084, 0x50a5, 0x60c6, 0x70e7,
0x8108, 0x9129, 0xa14a, 0xb16b, 0xc18c, 0xd1ad, 0xe1ce, 0xf1ef
);
for($a = 0; $a < strlen($data); $a++){
$i = (($crc >> 12) ^ ($data[$a] >> 4));
$crc = ($crc_table[$i & 0x0F] ^ ($crc << 4));
$i = (($crc >> 12) ^ $data[$a]);
$crc = ($crc_table[$i & 0x0F] ^ ($crc << 4));
}
return ($crc & 0xFFFF);
}
结果完全不匹配,我也不是这方面的专家。有什么建议吗?
编辑
谢谢"squeamish ossifrage"!
在你的帮助下,我现在正在使用这个功能:
private function crc($data){
$i = 0;
$crc = 0;
$crc_table = array
(
0x0000, 0x1021, 0x2042, 0x3063, 0x4084, 0x50a5, 0x60c6, 0x70e7,
0x8108, 0x9129, 0xa14a, 0xb16b, 0xc18c, 0xd1ad, 0xe1ce, 0xf1ef
);
$data = hex2bin($data);
$l = 0;
while($l < strlen($data)){
$byte = $data[$l];
$i = (($crc >> 12) ^ (ord($byte) >> 4));
$crc = ($crc_table[$i & 0x0F] ^ ($crc << 4));
$i = (($crc >> 12) ^ (ord($byte) >> 4));
$crc = ($crc_table[$i & 0x0F] ^ ($crc << 4));
$l++;
}
return ($crc & 0xFFFF);
}
我正在用 "Hello world" 作为十六进制“48656C6C6F20776F726C64”进行测试。
在 C 上,我得到 37278,在 php 函数上,我得到 56062 以上的值。
现在有什么线索吗?
编辑
好吧,我的错...问题已经解决了,但是经过这么多测试我自己都糊涂了。
这是我的第一个代码版本,"squeamish ossifrage":
建议更正
$byte = $data[$l];
$i = (($crc >> 12) ^ (ord($byte) >> 4));
$crc = ($crc_table[$i & 0x0F] ^ ($crc << 4));
$i = (($crc >> 12) ^ **ord($byte));**
$crc = ($crc_table[$i & 0x0F] ^ ($crc << 4));
$l++;
谢谢!
您的代码无法正常工作,因为您正在计算整数和字符串变量的异或积:
$i = (($crc >> 12) ^ ($data[$a] >> 4));
这里$data[$a]
是输入数据的一个子串。您应该使用 ord()
将其转换为整数:
$i = (($crc >> 12) ^ (ord($data[$a]) >> 4));
(编辑: 通过对您的 PHP 代码进行此更改,字符串 Hello, world!
在两个函数中的哈希值为 31454。)
已解决
我在 C 上有以下代码,我必须在 PHP
上编写它const U16 crc_table[16] = {
0x0000, 0x1021, 0x2042, 0x3063, 0x4084, 0x50a5, 0x60c6, 0x70e7,
0x8108, 0x9129, 0xa14a, 0xb16b, 0xc18c, 0xd1ad, 0xe1ce, 0xf1ef
};
U16 CalculateCrc(char *data, U32 len) {
U32 i;
U16 crc = 0;
while (len--) {
i = (crc >> 12) ^ (*data >> 4);
crc = crc_table[i & 0x0F] ^ (crc << 4);
i = (crc >> 12) ^ (*data >> 0);
crc = crc_table[i & 0x0F] ^ (crc << 4);
data++;
}
return (crc & 0xFFFF);
}
在基本的逻辑翻译中,到目前为止我是这样做的:
public function crc($data){
$i = 0;
$crc = 0;
/* @var $crc_table array */
$crc_table = array
(
0x0000, 0x1021, 0x2042, 0x3063, 0x4084, 0x50a5, 0x60c6, 0x70e7,
0x8108, 0x9129, 0xa14a, 0xb16b, 0xc18c, 0xd1ad, 0xe1ce, 0xf1ef
);
for($a = 0; $a < strlen($data); $a++){
$i = (($crc >> 12) ^ ($data[$a] >> 4));
$crc = ($crc_table[$i & 0x0F] ^ ($crc << 4));
$i = (($crc >> 12) ^ $data[$a]);
$crc = ($crc_table[$i & 0x0F] ^ ($crc << 4));
}
return ($crc & 0xFFFF);
}
结果完全不匹配,我也不是这方面的专家。有什么建议吗?
编辑
谢谢"squeamish ossifrage"! 在你的帮助下,我现在正在使用这个功能:
private function crc($data){
$i = 0;
$crc = 0;
$crc_table = array
(
0x0000, 0x1021, 0x2042, 0x3063, 0x4084, 0x50a5, 0x60c6, 0x70e7,
0x8108, 0x9129, 0xa14a, 0xb16b, 0xc18c, 0xd1ad, 0xe1ce, 0xf1ef
);
$data = hex2bin($data);
$l = 0;
while($l < strlen($data)){
$byte = $data[$l];
$i = (($crc >> 12) ^ (ord($byte) >> 4));
$crc = ($crc_table[$i & 0x0F] ^ ($crc << 4));
$i = (($crc >> 12) ^ (ord($byte) >> 4));
$crc = ($crc_table[$i & 0x0F] ^ ($crc << 4));
$l++;
}
return ($crc & 0xFFFF);
}
我正在用 "Hello world" 作为十六进制“48656C6C6F20776F726C64”进行测试。 在 C 上,我得到 37278,在 php 函数上,我得到 56062 以上的值。
现在有什么线索吗?
编辑
好吧,我的错...问题已经解决了,但是经过这么多测试我自己都糊涂了。
这是我的第一个代码版本,"squeamish ossifrage":
建议更正$byte = $data[$l];
$i = (($crc >> 12) ^ (ord($byte) >> 4));
$crc = ($crc_table[$i & 0x0F] ^ ($crc << 4));
$i = (($crc >> 12) ^ **ord($byte));**
$crc = ($crc_table[$i & 0x0F] ^ ($crc << 4));
$l++;
谢谢!
您的代码无法正常工作,因为您正在计算整数和字符串变量的异或积:
$i = (($crc >> 12) ^ ($data[$a] >> 4));
这里$data[$a]
是输入数据的一个子串。您应该使用 ord()
将其转换为整数:
$i = (($crc >> 12) ^ (ord($data[$a]) >> 4));
(编辑: 通过对您的 PHP 代码进行此更改,字符串 Hello, world!
在两个函数中的哈希值为 31454。)