【发布时间】:2019-08-04 17:44:23
【问题描述】:
我正在尝试计算二进制文件的 CRC16。
我首先从二进制文件中读取 2 个字节,然后计算 CRC16,Polynome= 1021 和 0xFFFF 初始值。我使用了 C 代码并试图将其翻译成 TCL。我不能使用字节格式,因为我通过计算得到一个关于使用非数字字符串的错误。所以我将字节转换为字符串。
proc main {}{
# open binary file
set file_read [open "$input_file" rb]
while {1} {
if {! [eof $fr]} {
append binary_data [read $file_read 2]
}
binary scan [string range $binary_data 0 1] H4 str_bin_data
set CRC_data [CRC_calculation $str_bin_data]
puts " CRC_data := $CRC_data"
}
}
proc CRC_calculation {str_bin_data} {
set Polynome 0x1021
set Highbit 0x8000
set CRC_data 0xFFFF
set byte 0
set bit 0
set data_ln [string length $str_bin_data]
# puts " data_ln := $data_ln"
for {set byte 0} {$byte < $data_ln} {incr byte} {
set CRC_data [ expr {$CRC_data ^ ([lindex $str_bin_data $byte] << 8)} ]
for {set bit 8} {$bit > 0} {incr bit -1} {
if {($CRC_data && $Highbit)} {
set CRC_data [expr {($CRC_data << 1) ^ $Polynome}]
} else {
set CRC_data [expr {$CRC_data << 1}]
}
}
puts " byte_index := $byte"
puts " CRC_data := $CRC_data"
}
return $CRC_data
}
在 C 中,当我定义一个字节数组示例(二进制文件中的前 8 个字节)时: 无符号字符字节[3]= {0x55,0x55,0x55,0x55}; 然后CRC = 0x82b8 在 Tcl 中,我没有得到正确的值,甚至没有 32 位 CRC 值。
这里是我正在使用的 C 代码:
#include<stdio.h>
#define Polynom 0x1021
#define Highbit 0x8000
unsigned short getCRC(const unsigned char data[])
{
unsigned short rem = 0xFFFF;
unsigned long byte = 0;
int bit = 0;
for (byte = 0; byte < 3; ++byte)
{
rem ^= (data[byte]<< 8);
for (bit = 8; bit > 0; --bit)
{
if (rem & Highbit)
rem = (rem << 1) ^ Polynom;
else
rem = (rem << 1);
}
}
return (rem);
}
int main() {
int rem ;
unsigned char data[]= {0x55,0x55,0x55,0x55};
rem = getCRC (data);
printf("%x", rem);
}
【问题讨论】:
-
看起来像是混淆了字符串和列表操作。并且实际上不知道您的输入数据的形式是什么。