5

次の質問を参照して: NSData を HEX NSString に変換する

Erik Aigner が提供するソリューションを使用して問題を解決しました。

NSData *data = ...;
NSUInteger capacity = [data length] * 2;
NSMutableString *stringBuffer = [NSMutableString stringWithCapacity:capacity];
const unsigned char *dataBuffer = [data bytes];
NSInteger i;
for (i=0; i<[data length]; ++i) {
  [stringBuffer appendFormat:@"%02X", (NSUInteger)dataBuffer[i]];
}

ただし、後ろに余分なゼロがあると、文字列の値が異なるという小さな問題が 1 つあります。たとえば。16 進数データが​​文字列 @"3700000000000000" の場合、スキャナーを使用して整数に変換すると:

unsigned result = 0;
NSScanner *scanner = [NSScanner scannerWithString:stringBuffer];
[scanner scanHexInt:&result];
NSLog(@"INTEGER: %u",result);

結果は 4294967295 になり、これは正しくありません。ヘキサ37だけが取られているので、それは55であるべきではありませんか?

では、どうすればゼロを取り除くことができますか?

編集:(CRDに応じて)

こんにちは、私の疑問を明確にしていただきありがとうございます。つまり、実際にバイト ポインターから 64 ビット整数を直接読み取ることですよね? しかし、私は別の質問があります。実際に NSData をバイト ポインタにキャストするにはどうすればよいですか?

わかりやすくするために、最初に何をしたかを説明します。

まず、私が持っているファイルのデータを表示しました(データは16進数です)

NSData *file = [NSData dataWithContentsOfFile:@"file path here"];
NSLog(@"Patch File: %@",file);

出力:

ここに画像の説明を入力

次に、ファイルの最初の 8 バイトを読み取ってオフセットし、文字列に変換しました。

// 0-8 bytes
[file seekToFileOffset:0];
NSData *b = [file readDataOfLength:8];
NSUInteger capacity = [b length] * 2;
NSMutableString *stringBuffer = [NSMutableString stringWithCapacity:capacity];
const unsigned char *dataBuffer = [b bytes];
NSInteger i;
for (i=0; i<[b length]; ++i) {
    [stringBuffer appendFormat:@"%02X", (NSUInteger)dataBuffer[i]];
}
NSLog(@"0-8 bytes HEXADECIMAL: %@",stringBuffer);

ご覧のとおり、0x3700000000000000 は次の 8 バイトです。次の 8 バイトにアクセスするために必要な唯一の変更は、SeekFileToOffset の値を 8 に変更して、次の 8 バイトのデータにアクセスできるようにすることです。

全体として、あなたがくれた解決策は役に立ちますが、16 進数値を手動で入力するのは現実的ではありません。バイトを文字列としてフォーマットしてから解析する方法ではない場合、データの最初の 8 バイトに直接アクセスしてバイト ポインターにキャストするにはどうすればよいですか?

4

2 に答える 2

3

4,294,967,295 はULONG_MAXであるため、スキャナが単純にオーバーフローしているように見えます。(このscanHexIntメソッドは、見つけたすべての 16 進数を食べます。0 も 16 進数であるため、メソッドは を通り越して、数字全体を丸呑みしULONG_MAXます。)

于 2012-11-21T09:06:41.873 に答える