【问题标题】:Binary addition Checksum in JavaJava中的二进制加法校验和
【发布时间】:2011-01-27 12:36:07
【问题描述】:

我正在尝试为消息实现校验和。规范是:

校验和是这样实现的 整个消息包装器和 消息数据,不包括校验和, 是简单二进制的结果 加法被截断为四个字节。

不过,恐怕我不知道如何在 Java 中做到这一点。我将不胜感激任何建议。

M.

【问题讨论】:

  • 出于好奇:什么使用这种校验和?除非我误解它,否则它是一个 非常 错误的校验和。例如,它不会检测到交换两个字节的任何错误。
  • 这是 STANAG 4586 规范的一部分。

标签: java checksum


【解决方案1】:

它们可能意味着对所有字节进行简单的无符号加法(假设 8 位字节是您与之交互的最小单位):

byte[] data = getTheDataFromSomewhere();
long checksum = 0;
for (int i = 0; i < data.length; i++) {
  checksum += (data[i] & 0xFF);
}
checksum = checksum & 0xFFFFFFFFL; // truncate to 4 byte

您也可以在那里使用int,但这会产生负数。按位计算是等价的,但这样比较值更容易。

【讨论】:

  • 非常感谢 Joachim,我会试一试的。根据规范,校验和的大小是 4 个字节,所以听起来我将使用 int。再次,非常感谢。
  • 我一直使用 long 的原因是 int 是有符号的(长也是如此,但如果只使用前 4 个字节,那么它总是正数)和大多数这些协议中的一些假定未签名操作。
【解决方案2】:

如果您愿意,可以使用 java 标准库函数。 http://download.oracle.com/javase/1.5.0/docs/api/java/util/zip/CRC32.html

【讨论】:

  • 感谢 jogabonito,我正在阅读这篇文章 - 只是为了检查一下,这是否应该执行上面详述的二进制添加?
  • 不,是CRC32,这是一个非常简单且标准化的校验和算法,但仍然比二进制加法复杂一些。
猜你喜欢
  • 2013-04-01
  • 1970-01-01
  • 1970-01-01
  • 2021-10-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-08-27
  • 1970-01-01
相关资源
最近更新 更多