我从一个文件读取2个字节,并尝试使用unsigned int作为我的SVG输出的ID。
unsigned int character_name_1;
unsigned int character_name_2;
fread( buffer, sizeof( char ), 4, fpi );
character_name_1=(((buffer[1]<<8)+buffer[0])&0xFFFF);
character_name_2=(((buffer[3]<<8)+buffer[2])&0xFFFF);
如果文件有2个值126和128,它们是0x007E和0x0080(缓冲区[0] = 0x7E和缓冲区[1] = 0x00),那么,如果我打印到我的SVG文件<g id=%u d=%s></g>",character_name_1, pathdata);
,那么我将id正确记录为'ID = “126”'。
但是,第二个值是有问题的:<g id=%u d=%s></g>",character_name_2, pathdata);
给了我以下条目:'id =“65408”'
下一个值,其中包含2个字节0xA0和0x00,我期望为160,写为65440. 0xA1和0x00应为161,但我得到65441。
我希望这很清楚。
你对buffer
的定义可能是签名类型(char
)。
这会使值0xA1
作为负数进行交互,并调用自动符号扩展(0xA1
- > 0xFFA1
),以确保正确处理总和(buffer[3]<<8 + buffer[2]
)。所以你得到0xFFA1
的值,即65441。
将缓冲区更改为unsigned char
将解决您的问题。
buffer
与char
或signed char
宣布。将其更改为unsigned char
。
由于buffer
中的元素已签名,因此表达式中的值为负值。
从你的问题中不太清楚,假设缓冲区是字符或字符指针的数组。我认为以下改变应该有效:
character_name_1=(((buffer[1]<<8)+buffer[0])&0xFF);
character_name_2=(((buffer[3]<<8)+buffer[2])&0xFF);