Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/svn/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Objective c 什么是f-ing我的数据?_Objective C - Fatal编程技术网

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
,这样可以避免任何歧义。