次の質問を参照して: 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 バイトに直接アクセスしてバイト ポインターにキャストするにはどうすればよいですか?