C 字符大于一个字节?
我正在从微控制器设备读取C 字符大于一个字节?,c,char,C,Char,我正在从微控制器设备读取char类型的缓冲区,如下所示: char data_buffer[DATA_LEN]; FILE *aq_dev = fopen(argv[1], "r"); fread(data_buffer, 1, DATA_LEN, aq_dev); fclose(aq_dev); 在这个缓冲区blob中有16位无符号整数,每个整数分布在缓冲区中的两个条目上。例如有 data_buffer[10] = 0x07 data_buffer[11] = 0xc3 我想把它读作0
char
类型的缓冲区,如下所示:
char data_buffer[DATA_LEN];
FILE *aq_dev = fopen(argv[1], "r");
fread(data_buffer, 1, DATA_LEN, aq_dev);
fclose(aq_dev);
在这个缓冲区blob中有16位无符号整数,每个整数分布在缓冲区中的两个条目上。例如有
data_buffer[10] = 0x07
data_buffer[11] = 0xc3
我想把它读作0x07c3
,等于1987年。尽管我最初认为我可以用uint16\u t
指针访问缓冲区并直接读取值,但我必须做一些奇怪的位屏蔽:
int value = (buffer[10] << 8) + buffer[11];
int value=(buffer[10]您的问题是char
在您的平台上签名。因此,如果设置了buffer[11]
的高位,它将是负值,当您在表达式中使用它时,它将首先升级为(负值)整数,有效地将字符的高位传播到所有高位
buffer[11] (char) 0xc3 -61
(int) 0xffffffc3 -61 // sign-extended
&
-ing与0xff
一起工作的原因是char
值在执行&
操作之前提升为int
:
buffer[11] (char) 0xc3 -61
(int) 0xffffffc3 -61 // sign-extended
& 0xff (int) 0x000000c3 195
修复方法是在执行位操作之前强制转换为无符号字符
:
int value = (((unsigned char) buffer[10]) << 8) | ((unsigned char) buffer[11]);
buffer[11] (char) 0xc3 -61
(unsigned char) 0xc3 195
(int) 0x000000c3 195
int value=((无符号字符)缓冲区[10])char
是有符号的还是无符号的?好吧,我理解你的意思,但是为什么位掩码会起作用呢?&在移位之前对所有8位进行赋值,尤其是高位,是吗?@lynix带符号扩展名的int
转换发生在任何算术运算之前,包括&
.
int value = (((unsigned char) buffer[10]) << 8) | ((unsigned char) buffer[11]);
buffer[11] (char) 0xc3 -61
(unsigned char) 0xc3 195
(int) 0x000000c3 195