Tag: 校验和

将C校验和函数转换为Lua

我正在编写一个脚本,允许我的主机设备将数据文件发送到从设备。 从站需要进行校验和计算,并在发送文件之前添加到我的请求的末尾。 我的问题是,我不仅对编程很新,而且还在努力完全掌握位操作。 我目前在一个Java类中,所以校验和function所以部分函数确实有一个熟悉的格式,但由于我仍然在用比特和位库弄乱我的头,我在将提供的校验和函数转换为Lua中。 在C中提供函数之前,首先将该函数描述如下: Initialise the checksum as FFFF(hex). For each byte Checksum = Checksum XOR (current Byte) For I = 0 to 7 If ((Checksum AND 1)=0) Checksum = Right_Bit_Shift Checksum 1 bit Else Checksum = (Right_Bit_Shift Checksum 1 bit) XOR A001(hex) Next I Next Byte 以下是用C编写的示例: /* *Routine CRC takes a data […]

如果只给出整个数据的CRC32,是否可以找到前缀的CRC32?

我必须在表中进行查找,并且我有一个字符串标识符和字符串的CRC32。 如果有未命中,我必须减小大小并查找标识符的前缀。 因此,我需要计算前缀的校验和,并为每个前缀重复该过程。 我的这个算法的C代码是这样的: find_prefix(char* string, uint16_t size, uint32_t crc, hash_table_t *hash_table){ do{ if(perform_lookup(string, size, crc, hash_table)==HIT){ return size; } size–; crc=calculate_crc(string, size, 0xFFFFFFFF); //Is there a better way? } while(size); } 我的问题是:在给定整个字符串的crc和字符串本身的情况下,我可以避免crc计算并派生前缀的crc吗? 我在这里和这里找到了一些相关的问题,但是我有一个约束:当表格被普遍填充时,标识符的crc是用硬件计算的,所以我不能修改算法,并且这两个链接提供了不同的答案计算校验和的方法(基本上使用所有组件的XOR)。 非常感谢你。

了解TCP校验和function

我相信TCP校验和function执行以下操作: 将伪头和TCP段头和数据分解为2个字节块。 如果长度不是2个字节,则在最后一个块的末尾添加一个0字节的填充,以使其为2个字节。 获取总和的一个补码以获得TCP校验和。 听起来很简单。 因此我编写了自己的通用checksum函数: #include #include uint16_t checksum(uint16_t * data, int size) { uint16_t sum = 0; int i = 0, length = size / 2; while (i < length) sum += data[i++]; if (size % 2) sum += data[i] & 0xFF00; return htons(~sum); } 然而,其他人写的checksumfunction似乎更复杂。 例如: uint16_t checksum(uint16_t * addr, int len) […]