目标c中的Adler32校验和



我正在使用一个应用程序,该应用程序将数据发送到服务器,并使用用户位置信息。服务器根据校验和计算接受此数据,该计算用Java编写。
这是Java编写的代码:

private static final String CHECKSUM_CONS = "1217278743473774374";
private static String createChecksum(double lat, double lon) {
    int latLon = (int) ((lat + lon) * 1E6);
    String checkSumStr = CHECKSUM_CONS + latLon;
    byte buffer[] = checkSumStr.getBytes();
    ByteArrayInputStream bais = new ByteArrayInputStream(buffer);
    CheckedInputStream cis = new CheckedInputStream(bais, new Adler32());
    byte readBuffer[] = new byte[50];
    long value = 0;
    try {
        while (cis.read(readBuffer) >= 0) {
            value = cis.getChecksum().getValue();
        }
    } catch (Exception e) {
        LOGGER.log(Level.SEVERE, e.getMessage(), e);
    }
    return String.valueOf(value);
}

我试图寻找帮助,以了解如何编写目标c等效。上面的函数使用Adler32,我对此一无所知。请帮助。

感谢您的时间。

@achievelimitless和 @user3275097所示的答案不正确。

首先,不应使用签名的整数。负数的模型运算符在不同语言中的定义不同,应在可能的情况下避免。只需使用未签名的整数。

第二,循环将迅速溢出16位蓄能器,这将给出错误的答案。可以将模型操作推迟,但必须在溢出之前完成。您可以通过假设所有输入字节为255。

第三,由于第二点,您不应使用16位类型。您应该使用至少32位类型来避免经常进行模量操作。您仍然需要限制循环数量,但是数量越大。对于32位未签名类型,最大循环数为55522。因此,基本代码看起来像:

#define MOD 65521
#define MAX 5552
unsigned long adler32(unsigned char *buf, size_t len)
{
    unsigned long a = 1, b = 0;
    size_t n;
    while (len) {
        n = len > MAX ? MAX : len;
        len -= n;
        do {
            a += *buf++;
            b += a;
        } while (--n);
        a %= MOD;
        b %= MOD;
    }
    return a | (b << 16);
}

如@sulthan所述,您应该简单地使用Zlib中提供的adler32()功能,该功能已在Mac OS X和ios上。

根据Wikipedia中提到的Adler32校验和的定义,

目标C实施将是这样的:

   static NSNumber * adlerChecksumof(NSString *str)
{
    NSMutableData *data= [[NSMutableData alloc]init];
    unsigned char whole_byte;
    char byte_chars[3] = {'','',''};
    for (int i = 0; i < ([str length] / 2); i++)
    {
        byte_chars[0] = [str characterAtIndex:i*2];
        byte_chars[1] = [str characterAtIndex:i*2+1];
        whole_byte = strtol(byte_chars, NULL, 16);
        [data appendBytes:&whole_byte length:1];
    }
    int16_t a=1;
    int16_t b=0;
    Byte * dataBytes= (Byte *)[data bytes];
    for (int i=0; i<[data length]; i++)
    {
        a+= dataBytes[i];
        b+=a;
    }
    a%= 65521;
    b%= 65521;
    int32_t adlerChecksum= b*65536+a;
    return @(adlerChecksum);
}

这里的str将是您的问题中提到的字符串。

因此,当您要计算某些字符串的校验和时,只需这样做:

NSNumber * calculatedChkSm= adlerChecksumof(@"1217278743473774374");

请让我知道是否需要更多信息

相关内容

  • 没有找到相关文章

最新更新