什么是我的数据?

时间:2011-06-07 02:12:42

标签: objective-c

我收到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

,我该怎样才能获得这些数据?

2 个答案:

答案 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 f89cb0f8都是否定的,所以通过将额外的位全部设为1来对它们进行符号扩展,这就是为什么你得到一堆f s