2

Bluetooth 経由で送信するメッセージの LRC を計算したいと考えています。たとえば、メッセージは次のとおりです。

(メッセージ構造はSTX MESSAGE FS EXT LRC)

02 1212004123422826E0B8C0F000F0A00182620000サイロン システムズ ワトフォード UKR 1C 03 60

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

私がしなければならないことは、STX 文字を除くが EXT 文字を含む、通信メッセージ内のすべての文字のモジュロ 2 バイナリ和を実行することによって、LRC を計算することです。

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」がないことです。誰かがそれを手伝ってくれますか?

よろしくお願いします!

4

2 に答える 2

1

私は答えを持っています!

メソッド- (void) calculateLRC:(NSString *) textでは、次を置き換える必要があります。

checksum += * array++;

と :

checksum ^= * array++;

Objective C では Modulo 文字は "%" だったと思います...

于 2012-09-21T12:17:35.437 に答える