我收到NSData *
并尝试逐字节获取,但数据填充f
。
NSData *Data = getData();
cout << "The log way:" << endl;
NSLog(@"%@", Data);
cout << "The data way:" << endl;
char *data = (char *)[Data bytes];
for(int i = 0; i < [Data length]; i++)
{
cout.width(2);
cout.fill(0);
cout << hex << (int)(data[i]) << " ";
}
cout << endl;
我得到的是输出:
The log way:
/* something long about time and file */<1f9cb0f8>
The data way:
1f ffffff9c ffffffb0 fffffff8
如果int
没有所有f
?
答案 0 :(得分:4)
char
数据类型是未定义的签名,似乎你的编译器(gcc或clang?)决定它应该签名。因此,当您将char
转换为更大的类型时,将使用符号扩展,该扩展使用最高有效位具有的相同值填充额外位。对于值大于0x7F
的字节,设置了最高有效位,因此它会破坏放大。
你想要的是零扩展,它将额外的位归零。您可以使用unsigned char
类型获取它。
这应该这样做:
unsigned char *data = (unsigned char *)[Data bytes];
顺便说一句,-[NSData bytes]
返回一个const
指针。你应该尊重这一点并将你的指针标记为const
:
const unsigned char *data = (const unsigned char *)[Data bytes];
答案 1 :(得分:0)
这就是数据的整数。数据被分成字节并符号扩展为整数。作为字节,您的数据为1f 9c b0 f8
。 9c
,b0
和f8
都是否定的,所以通过将额外的位全部设为1来对它们进行符号扩展,这就是为什么你得到一堆f
s