Objective c 什么是f-ing我的数据?
我正在获取一个Objective c 什么是f-ing我的数据?,objective-c,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++) {
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;
NSData*Data=getData();
cout这是一些整数形式的数据。数据被拆分为字节,符号扩展为整数。作为字节,您的数据是1f 9c b0 f8
<代码>9c
、b0
和f8
都是负数,因此它们通过将多余的位全部设为1来进行符号扩展,这就是为什么会得到一堆f
s.数据作为整数的原因。数据被拆分为字节,符号扩展为整数。作为字节,您的数据是1f 9c b0 f8
9c
、b0
和f8
都是负数,因此它们通过将多余的位全部设为1进行符号扩展,这就是为什么会得到一堆f
s。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];
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];
您可以将
char*data
更改为unsigned char*data
以强制零扩展,因为所有数字都将被视为正数。您可以将char*data
更改为unsigned char*data
以强制零扩展,因为所有数字都将被视为正数。我认为llvm是这里的编译器。我记得char没有签名。。。嗯,我猜苹果生活在他们自己的世界里。我相当肯定gcc也会这样做。然而,我记得有一个编译器选项用于char
的签名。否则,您也可以使用uint8\u t
,这样可以避免任何歧义。我认为llvm是这里的编译器。我记得char没有签名。。。嗯,我猜苹果生活在他们自己的世界里。我相当肯定gcc也会这样做。然而,我记得有一个编译器选项用于char
的签名。否则,您也可以使用uint8\t
,这样可以避免任何歧义。