我正在实施可靠的数据传输协议。最大数据包长度为1000个字节。我需要多少字节来存储最大数据包大小的校验和?我尝试使用一个字节来存储校验和,但接收器无法获得与存储校验和相同的校验和。
Checksum checksum = new CRC32();
checksum.update(out_data, 0, out_data.length-1);
Long checksumValue = checksum.getValue();
out_data[out_data.length-1] = checksumValue.byteValue();
这是我的校验和实现代码。我使用字节数组的最后一个槽作为校验和。请注意,这不是损坏数据包的情况,因为我正在运行的不可靠网络的模拟可以变得可靠。
答案 0 :(得分:3)
你可以校验任何大小的东西。以太网帧通常为1500+字节,仅使用4个字节作为校验和。如果你想要安全起见,请使用sha1(但它占用20个字节并且计算速度很慢)。
要将CRC32的结果放入数组,需要4个字节(每个字节32位/ 8位)。
答案 1 :(得分:2)
字节数组长度1000的校验和的字节数
这是一个非常难的问题。
首先,无论校验和有多大,无论如何计算,都无法消除不可检测的腐败的可能性。 (即使校验和值与消息值一样多,也无法消除传输损坏消息和校验和的可能性......)
如果我们对所有可能的损坏进行平均,那么我们所希望的最好的是N位校验和将失败在2 N <中检测到一次损坏/ SUP>。如果该概率太高,则需要增加N.
要完成这个简单的分析,您必须考虑特定的校验和算法及其检测常见错误的能力;例如单比特翻转,比特转置等。我并不“知道这个数学”,但我认为实际校验和算法真的很复杂,而且经验方法会给出最好的答案。但我也想象推荐的算法接近理论上的“一次2 N ”,并且它们对于常见的错误综合症没有任何特殊的弱点。
所以,最好的建议可能是找出你习惯的概率并用它来选择N
......以及一种算法,它给你那个大小(或更大)的校验和。