objective-c - 如何在 Objective C 中计算 CheckSum

标签 objective-c ios checksum

我正在开发一个处理外部硬件通信的应用程序,但在获取包的校验和时遇到问题。 (我在制作这个应用程序时仍在学习 Objective C,所以我对此还很陌生。) 在另一个用 C 编写的代码中,校验和的计算如下:

byte CalculateCheckSum (byte txcount){
    byte local_cs=0;
    while(txcount>0){
        local_cs+=*x_ptr;
        x_ptr += 1;
        txcount--;
    };
    return (~local_cs+1);
}

我尝试使用 Objective-C 的一些代码:

u_int8_t synByteSOH[]= {SYN,SYN,SOH,SETSERIALINFO};
- (Byte)CalcCheckSum:(Byte)i
{   u_int8_t synByteSOH[]= {SYN,SYN,SOH,SETSERIALINFO};
    Byte local_cs = 0;
    int j = 0;
    while (i>0) {
        local_cs += synByteSOH[j];
        i--;
        j++;
    };
    return (~local_cs+1);

}

没有警告或错误,但据说 clang: 错误: 链接器命令失败,退出代码 1 有谁知道这是为什么?我应该如何解决它?

最佳答案

所有有效的 C 代码都是有效的 Objective C 代码。不要尝试将其重写为 Objective C 方法 - 这样做的值(value)为零。

调整原始函数的技巧在于它依赖于几个因素:byte 被类型化,以及一个名为 x_ptr 的全局/静态变量。

关于 x_ptr,它来自哪里以及它在原始版本中是如何初始化的,我们从粘贴的代码片段中一无所知。因此,假设字节数组 synByteSOH 是您需要校验和的数据 block ,只需引入一个 byte* 类型的文件静态变量 x_ptr 并将其初始化为您的数据 block :

typedef unsigned char byte;
static byte *x_ptr;

byte CalculateCheckSum (byte txcount)
//...Follows as pasted

//...

//And now we call it elsewhere:
byte synByteSOH[]= {SYN,SYN,SOH,SETSERIALINFO};         
x_ptr = synByteSOH
byte Checksum = CalculateCheckSum(4); //4 is the data block size

一般来说,即使在 ObjC 项目中,拥有 C 函数也是完全可以的。没有人说过每段代码都应该在类方法中。

关于objective-c - 如何在 Objective C 中计算 CheckSum,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11802999/

相关文章:

ios - 为什么 UIWebView 无法在 Safari 中打开我的链接?

iphone - 获取 iPhone 自动锁定设置

ios - objective-c 使用 AutoResizingMask 将 UILabe 对齐到 UitableViewCell 内部

objective-c - 从多对多关系中获取核心数据

networking - 如何使用多项式/CRC在此二进制消息上运行错误检测?

c# - 相当于 Windows 中的 Unix cksum

checksum - Ceph Bluestore 校验和 : What's the word on bitrot?

iphone - Wifi设备到设备通信问题

iphone - 多次选择后 datePicker 崩溃

javascript - 替代 javascript 事件中的 `touchmove`