Search code examples
iosiphoneobjective-cadler32

adler32 checksum in objective c


I am working on a app which sends data to server with user location info. Server accept this data based on checksum calculation, which is written in java.
Here is the code written in 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);
}

I tried looking for help to find out how to write objective c equivalent of this. Above function uses adler32 and I don't have any clue about that. Please help.

Thanks for your time.


Solution

  • On basis of definition of adler32 checksum as mentioned in wikipedia,

    Objective C implementation would be like this:

       static NSNumber * adlerChecksumof(NSString *str)
    {
        NSMutableData *data= [[NSMutableData alloc]init];
        unsigned char whole_byte;
        char byte_chars[3] = {'\0','\0','\0'};
        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);
    }
    

    Here str would be your string as mentioned in your question..

    So when you want to calculate checksum of some string just do this:

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

    Please Let me know if more info needed