如何计算目标C中的CheckSum

时间:2012-08-03 20:41:44

标签: objective-c ios checksum

我正在开发一个处理外部硬件通信的应用程序,我在获取程序包的校验和时遇到问题。 (我在制作这个应用程序时仍然在学习目标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);
}

我尝试使用目标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 有谁知道为什么会这样?我该如何解决?

1 个答案:

答案 0 :(得分:1)

所有有效的C代码都是有效的Objective C代码。不要尝试将其重写为Objective C方法 - 对此没有价值。

调整原始函数的技巧是它依赖于以下几个方面:byte是typedeffed,以及一个名为x_ptr的全局/静态变量。

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

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函数也是完全可以的。没有人说每一段代码都应该在类方法中。