C 为什么是'\xff';不被认出来?
我知道0xff可以有不同的表示形式,具体取决于变量类型。类似于-1表示有符号字符(chars/int(?),255表示无符号字符 但是我使用的是独立于实现的uint8_t类型,并且我已经确保0xff实际上在我迭代的结构中。代码如下: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
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位int255
将提升为(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),但它没有提到有符号或无符号的字符。