0

非常に基本的な質問。:(。16進値があり、NSDataに対応しようとしていますが、次のことを試しました。

  unsigned char  bytes [] = {0x0f0121dd06a2d00503040705aa010ba2d0a2d0};
  NSData *data = [NSData dataWithBytes: bytes  length:19];
  NSLog (@" DAta is %@ ", data);

次の警告が表示されます

34:37: warning: integer constant is too large for its type
34: warning: large integer implicitly truncated to unsigned type

データは次のように出力されます。

NSDataExample[36136:707]  DAta is <d028e08c 7fff7f00 00000000 00000000 0008fc>

私はそれを正しい方法でやっているかどうかわかりませんか?親切にアドバイス。

4

2 に答える 2

1

char配列を適切に割り当てていないようです。割り当てているタイプには大きすぎるためです。例として、これはどうですか:

#import <Foundation/Foundation.h>

int main(int argc, char *argv[]) {
    NSAutoreleasePool *p = [[NSAutoreleasePool alloc] init];

    // your example has longer hex value, truncated here for clarity...
    unsigned char bytes[] = { 0x0F, 0x01, 0x21};
    NSData *data = [NSData dataWithBytes:bytes  length:3];
    NSLog (@" Data is %@ ", data);

    [p release];
}

コンソール2012-11-19 06:40:07.581 Untitled 2[12472:707] Data is <0f0121>に出力します

または、16 進バイトが文字列の形式である場合は、次のようになります。

#import <Foundation/Foundation.h>

int main(int argc, const char * argv[])
{

    @autoreleasepool {
        NSString *hexString = @"0x0f0121dd06a2d00503040705aa010ba2d0a2d0";
        NSMutableData *data = [[NSMutableData alloc] init];
        NSRegularExpression *expression = [NSRegularExpression regularExpressionWithPattern:@"[A-Fa-f0-9]{2}" options:0 error:NULL];
        [expression enumerateMatchesInString:hexString options:0 range:NSMakeRange(0, hexString.length) usingBlock:^(NSTextCheckingResult *result, NSMatchingFlags flags, BOOL *stop) {
            int hex = (int)strtol([[hexString substringWithRange:result.range] UTF8String], NULL, 16);
            printf("hex = %d\n",hex);
            [data appendBytes:&hex length:1];
        }];
        NSLog(@"%s - data = %@",__FUNCTION__,data);
    }
    return 0;
}

これ2012-11-19 06:56:15.753 TestHexStringToBytes[12891:303] main - data = <0f0121dd 06a2d005 03040705 aa010ba2 d0a2d0>はコンソールに出力されます。

于 2012-11-19T12:40:15.170 に答える
0

大きすぎます。char 配列を使用していますが、配列には 1 文字しか含まれておらず、切り捨てられるため、配列は必要ありません。
しかし、long unsigned int を使用しても、この値を格納するのに十分なメモリがありません。代わりに memset を使用し、各バイトの値を計算してください。

于 2012-11-19T12:40:03.190 に答える