校验和CRC 16从C 到Java
Checksum CRC 16 from C++ to Java
我的源具有C 中的charksum crc16:
quint16 MainWindow::calculateCRC16(QByteArray buffer)
{
quint16 newCrc;
quint8 i;
newCrc = 0xFFFF;
for(i = 0; i < buffer.size(); i++){
newCrc = this->crc16_update(newCrc, (quint8)buffer.at(i));
}
return newCrc;
}
quint16 MainWindow::crc16_update(quint16 crc, quint8 a)
{
quint8 i;
crc ^= a;
for (i = 0; i < 8; ++i) {
if (crc & 1)
crc = (crc >> 1) ^ 0xA001;
else
crc = (crc >> 1);
}
return crc;
}
例如,当我们放置时:
QByteArray buffer = x02x14x14x00x00x00x00x00x00x00x00x00x00
结果是:
int result = 65535
QByteArray result = x1dx20
我试图在Java中获得相同的结果,但没有积极效果
第一个示例:
int calculate_crc(byte[] bytes) {
int i;
int crc_value = 0;
for (int len = 0; len < bytes.length; len++) {
for (i = 0x80; i != 0; i >>= 1) {
if ((crc_value & 0x8000) != 0) {
crc_value = (crc_value << 1) ^ 0x8005;
} else {
crc_value = crc_value << 1;
}
if ((bytes[len] & i) != 0) {
crc_value ^= 0x8005;
}
}
}
return crc_value;
}
另一个:
private int calculateCRC16(byte[] buffer)
{
int newCrc;
int i;
newCrc = 0xFFFF;
for(i = 0; i < buffer.length; i++) {
newCrc = this.crc16_update(newCrc, buffer[i]);
}
return newCrc;
}
int crc16_update(int crc, int a)
{
int i;
crc ^= a;
for (i = 0; i < 8; ++i) {
if ((crc & 1) == 1){
crc = (crc >> 1) ^ 0xA001;
}
else{
crc = (crc >> 1);
}
}
return crc;
}
例如,当我们使用两种情况时:
byte[] buffer = 0x2 0x14 0x14 0x0 0x0 0x0 0x0 0x0 0x0 0x0 0x0 0x0 0x0
结果是:
int result = 26997
byte[] result = 0x69 0x75
也许有人可以帮助我找到正确的方法,我不知道怎么了...
0x6975
或十进制26997
是正确的结果。您的C 结果没有意义。(十六进制和十进制的值都不相同。)
是的,这是我的错误。
我再次检查了输出,这就是重点。
C 的结果这不像Quint16大小(unsigned int 2字节0至65535)
我在错误的地方printf。
这不是一个原因,另一个是bytearray之间的小区别。
相关文章:
- 在java中解决这段代码时面临循环中的问题
- 尝试用java代码编译和运行c++代码
- 在这种情况下,java对象是否可以调用本机函数
- 在java中读取c++字节的位字段
- 为什么C++对链表中的下一个节点使用指针,而像 C# 或 Java 这样的语言只使用类 Node 的名称?
- 使用已使用 java 编码的 openssl 解码数据
- SWIG Java 在使用 -DSWIGWORDSIZE64 时将int64_t转换为 jlong
- Android Java USB for native cpp
- 在由Sublime文本3编译后在cmd上显示Java程序输出
- C++ equivalent to Java Map getOrDefault?
- C++ 中的 Java 样式枚举
- 是否有技术原因阻止 Java 中的 final C++ 像 const 一样严格?
- 加密在 Windows、C++ 和 Java 中传输中的数据
- Java从C++回调到C++回调
- 在 c++ 中模拟输入并在 JAVA 中读取它?
- 用C++包装 Java 库 (JNI)
- 使用 TreeSet Java 对反转进行计数
- 验证openssl c++中的签名,这是由JAVA DSA签名的?
- 校验和CRC 16从C 到Java
- 带有boost::CRC_32_type的CRC结果与java.util.zip.CRC32不同