Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/visual-studio-2012/2.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
C 为什么是'\xff';不被认出来?_C - Fatal编程技术网

C 为什么是'\xff';不被认出来?

C 为什么是'\xff';不被认出来?,c,C,我知道0xff可以有不同的表示形式,具体取决于变量类型。类似于-1表示有符号字符(chars/int(?),255表示无符号字符 但是我使用的是独立于实现的uint8_t类型,并且我已经确保0xff实际上在我迭代的结构中。代码如下: struct pkt { uint8_t msg[8]; }; void main(int argc, char **argv) { ... struct pkt packet; memset(&packet, 0, si

我知道0xff可以有不同的表示形式,具体取决于变量类型。类似于-1表示有符号字符(chars/int(?),255表示无符号字符

但是我使用的是独立于实现的uint8_t类型,并且我已经确保0xff实际上在我迭代的结构中。代码如下:

struct pkt {
    uint8_t msg[8];
};

void main(int argc, char **argv) {
    ...

    struct pkt packet;
    memset(&packet, 0, sizeof packet);
    strcpy(packet.msg, "hello");
    packet.msg[strlen("hello")] = '\xff';

    crypt(&packet, argv[1]);    

    ...
}

void crypt(struct pkt *packet, unsigned char *key) {
    int size = msglen(packet->msg);

    ...
}

int msglen(uint8_t *msg) {
    int i = 0;
    while(*(msg++) != '\xff') {
        i++;
    }
    return i;
}
我已经研究了结构,packet.msg[5]确实设置为0xff。但是while循环进入无限循环,就像它从未发现0xff一样

0x7f等值有效。我还没有尝试0x80,但我怀疑如果0xff不尝试,它可能不会工作。这可能与信号有关,但我就是看不出问题是从哪里来的

谢谢


编辑:对我来说,使用0x7f或0xff并不重要。但我只想知道是什么阻止我检测0xff。

如果你有一个未签名的字符,你就不能使用字符文本

“\xff”是-1,而不是255,因为a字符文字是有符号的


while条件始终为真。如果未签名,则应仅使用数字:0到255,或者使用已知为
\xff
的字符作为字符常量。它的类型是
int
,而不是
char
(这是C与C++不同的一种方式),但它的值取决于纯
char
是有符号的还是无符号的,这是实现定义的

C标准中的措辞为:

反斜杠和字母
x
后面的十六进制数字 十六进制转义序列被认为是构造的一部分 整型字符常量的单个字符或单个 宽字符用于宽字符常量。数值 这样形成的十六进制整数指定所需的 字符或宽字符

如果纯
char
无符号,则
'\xff'
相当于
0xff
255
;它的类型为
int
,值为
255

如果对纯
char
进行了签名,则
'\xff'
指定一个超出
char
范围的值(假设
char
为8位)。我对标准的措辞不是100%清楚,但至少在gcc中,
'\xff'
的值是
-1

只需使用整数常量
0xff
,而不是字符常量
\xff'
0xff
的类型为
int
,并保证其值为
255
,这是您想要的值

我知道0xff可以有不同的表示形式,具体取决于变量类型。类似于-1表示有符号字符(chars/int(?),255表示无符号字符

这需要一些解释。在C程序中,整数文本
0xFF
始终表示
255
。如果将其分配给
255
超出范围的类型,例如
signed char
,则行为由实现定义。通常在2的补码系统上,这被定义为赋值
-1

字符文字与整数文字具有不同的规则。字符文字
'\xff'
必须是可以放在
字符中的值。您似乎已经签署了
char
,因此这里发生的事情是由实现定义的,但最常见的行为是它获取值
-1
。请注意,字符文字实际上具有类型
int
,尽管它们必须具有可由
char
表示的值

packet.msg[strlen(“hello”)]='\xff',您尝试将
(int)-1
分配给
uint8\u t
。这是超出范围的,但是对于超出范围的有符号类型的赋值,行为定义得很好,因此得到的值是
-1(mod 256)
,即
255

最后,当使用
=
运算符(以及大多数运算符)时,如果值尚未为int,则将值提升为
int
。8位int
255
将提升为
(int)255
,并将其与
(int)-1
进行比较,结果不同


要解决此问题,请将比较更改为
0xFF
,或
(uint8_t)'\xFF'
,((msg++)!=(uint8_t)\xFF'){
main
返回
int
,而不是
void
。如果启用
-Wall-Wextra
,您将看到“已签名和未签名之间的比较”有关行上的警告。
'\xff'
是字符常量,而不是字符串文字。字符串文字没有符号;它们表示数组。类型
char
可以是有符号的,也可以是无符号的,具体取决于实现。如果纯
char
没有符号,则
'\xff'
的值为255类型
int
。如果签署了纯
char
,则标准的措辞不清楚(至少对我而言).虽然答案的基本性质是正确的,但语句中有错误。-我说的是1。是的-我指的是值文字而不是字符串文字。Keith你所说的“它们代表数组”是什么意思。C标准还说它们必须是int(即有符号的int),但它没有提到有符号或无符号的字符。