- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我有关于创建这样描述的消息的校验和的说明:
校验和由一个字节组成,等于从“消息类型”字开始到消息 block 结尾的所有字节的二进制补码和(不包括传输的校验和)。忽略最高有效位的进位。
我找到的另一个描述是:校验和值包含数据消息中其他字(即消息类型、消息长度和数据字)的模 256 和的二进制补码。接收设备可以计算接收到的字的模 256 和,并将该和添加到接收到的校验和字中。结果为零通常表示消息已正确接收。
我理解这意味着我将消息中所有字节的值相加(不包括校验和),得到这个数字的模 256。得到这个数字的补码,这就是我的校验和。
但是我在处理示例消息示例时遇到了问题(来自设计文档,因此我必须假设它已被正确编码)。
unsigned char arr[] = {0x80,0x15,0x1,0x8,0x30,0x33,0x31,0x35,0x31,0x30,0x33,0x30,0x2,0x8,0x30,0x33,0x35,0x31,0x2d,0x33,0x32,0x31,0x30,0xe};
所以最后一个字节 0xE 是校验和。我计算校验和的代码如下:
bool isMsgValid(unsigned char arr[], int len) {
int sum = 0;
for(int i = 0; i < (len-1); ++i) {
sum += arr[i];
}
//modulo 256 sum
sum %= 256;
char ch = sum;
//twos complement
unsigned char twoscompl = ~ch + 1;
return arr[len-1] == twoscompl;
}
int main(int argc, char* argv[])
{
unsigned char arr[] = {0x80,0x15,0x1,0x8,0x30,0x33,0x31,0x35,0x31,0x30,0x33,0x30,0x2,0x8,0x30,0x33,0x35,0x31,0x2d,0x33,0x32,0x31,0x30,0xe};
int arrsize = sizeof(arr) / sizeof(arr[0]);
bool ret = isMsgValid(arr, arrsize);
return 0;
}
规范在这里:= http://www.sinet.bt.com/227v3p5.pdf
我想我误解了所需的算法。知道如何创建此校验和吗?
Flippin 规范作者在他们的数据示例中犯了一个错误。刚发现这个然后回到这里发现其他人也被发现了。对不起,如果我浪费了你的时间。我会研究回复,因为它看起来像是一些对改进我的代码有用的评论。
最佳答案
您从链接的 pdf 中错误复制了示例消息。第二个参数长度是9个字节,但是你在代码中使用了0x08。
当参数中实际上有 9 个字节时,文档在第三列中错误地声明了“8 个字节”。第二列正确显示“00001001”。
换句话说,您的测试消息应该是:
{0x80,0x15,0x1,0x8,0x30,0x33,0x31,0x35,0x31,0x30,0x33,0x30, // param1
0x2,0x9,0x30,0x33,0x35,0x31,0x2d,0x33,0x32,0x31,0x30,0xe} // param2
^^^
使用正确的消息数组,ret == true
当我尝试你的程序时。
关于c++ - 校验和计算——所有字节的补码和,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12238528/
如何在 PHP 中生成 CRC-8 校验和? 最佳答案 function crcnifull ($dato, $byte) { static $PolyFull=0x8c; for ($i=0
我正在编写代码来使用 32 位无符号整数计算 CRC16。当尝试打印执行 CRC 操作的 XOR 函数的返回值时,它总是打印 0。我尝试了各种调试方法,例如打印语句,但是,我似乎无法弄清楚! 这是我的
ThinkPHP3.2.3验证码显示、刷新、校验 ,具体如下: 显示验证码 首先在Home/Controller下创建一个公共控制器PublicController
我想将自定义验证绑定(bind)到 TimePicker 自定义控件,但下面的代码显示“无法将内容添加到 TimePicker 的对象类型。”。
目录 Spring 校验(validator,JSR-303)实现 什么是JSR-303规范 与Spring MVC结合 实体类添加
导包和配置 导入 JSR 303 的包、hibernate valid 的包 ?
我是一名优秀的程序员,十分优秀!