2012-09-20 62 views
2

我想計算通過藍牙發送的消息的LRC。這裏是例如消息:在目標c中計算LRC

(該消息結構是STX消息FS EXT LRC)

02 1212004123422826E0B8C0F000F0A00182620000THYRON SYSTEMS沃特​​福德UKR 1C 03 60

STX = 02 
MESSAGE = 1212004123422826E0B8C0F000F0A00182620000THYRON SYSTEMS WATFORD UKR 
FS = 1C 
EXT = 03 
LRC = 60 

我要做的是計算LRC通過執行除STX字符之外的通信消息中的每個字符的模2二進制和,但包括EXT字符。

之前計算LRC,我不得不這樣的NSString轉換成HexaString:使用

31323132 30303431 32333432 32383236 45304238 43304630 30304630 41303031 38323632 30303030 54485952 4f4e2053 59535445 4d532057 4154464f 52442055 4b521c03

方法:

- (NSString *) stringToHex:(NSString *)str 
{ 
    NSUInteger len = [str length]; 
    unichar *chars = malloc(len * sizeof(unichar)); 
    [str getCharacters:chars]; 

    NSMutableString *hexString = [[NSMutableString alloc] init]; 

    for(NSUInteger i = 0; i < len; i++) 
    { 
     [hexString appendFormat:@"%02x", chars[i]]; 
    } 
    free(chars); 

    return [hexString autorelease]; 
} 

然後我必須在字節數組中進行轉換。使用 方法:

- (NSData*) hexToBytes:(NSString *) hexaStr { 

    NSMutableData* data = [NSMutableData data]; 
    int idx; 
    for (idx = 0; idx+2 <= hexaStr.length; idx+=2) { 
     NSRange range = NSMakeRange(idx, 2); 
     NSString * hexStrTmp = [hexaStr substringWithRange:range]; 
     NSScanner* scanner = [NSScanner scannerWithString:hexStrTmp]; 
     unsigned int intValue; 
     [scanner scanHexInt:&intValue]; 
     [data appendBytes:&intValue length:1]; 
    } 
    return data; 
} 

然後我嘗試做計算我LRC,這應該是60,有以下幾點:

- (void) calculateLRC:(NSString *) text { 

    NSData * data = [self hexToBytes:text]; 

    NSUInteger size = [data length]/sizeof(const char); 
    const char * array = (const char*) [data bytes]; 

    char checksum = 0; 

    for(uint32_t i = 0 ; i < size; i++) { 

     checksum += * array++; 
    } 

    NSLog(@"Checksum = %c", checksum); 

    self.LRC_Check = checksum; 
} 

的問題是,「校驗」有沒有價值「60 「 在裏面。有人可以幫我嗎?

Thanx提前!

+0

我不不知道爲什麼,但我的「嗨,夥計們!」沒有出現在我的消息...對不起,我是一個有禮貌的傢伙;-) – Lelka

+0

沒有會殺了你:) –

回答

1

我有答案!

在該方法中- (void) calculateLRC:(NSString *) text我不得不更換:

checksum += * array++; 

有:

checksum ^= * array++; 

我thougt模數字符的目標C是 「%」 ...