我遇到了一个有点奇怪的问题 - 我有一个char数组,我想输出为十六进制。我不介意作为int进行转换,但是当我这样做时,在一些数字前添加了很多f。我有这个代码为我做输出:
for (int i = 0; i<(bmp.BytesPerRow*bmp.Height);i++) // once per color per pixel
{
if(i%3==0) // one line between each pixel
{
cout << "\n";
}
int tmp = (int) bmp.Raster[i];
cout << "\nbmp.Raster[" << i << "]": " << hex << tmp;
}
我的输出如下:
bmp.Raster[0]: ffffffff
bmp.Raster[1]: ffffffff
bmp.Raster[2]: ffffffff
bmp.Raster[3]: 40
bmp.Raster[4]: 20
bmp.Raster[5]: ffffffe0
bmp.Raster[6]: 40
bmp.Raster[7]: ffffffe0
bmp.Raster[8]: 20
etc...
坦率地说,我不明白。我能理解是不是
ff
ff
ff
40
20
e0
etc...
我可以理解f是否被附加到所有内容上(我认为这是一个铸造过程的工件并且只丢弃了前6个输出)但只有一些?我不明白。
其他信息:
bmp.Raster来自Juan Soulie友情提供的CRaster [1]类
IDE是Microsoft Visual C ++ 2010 Express,它会自动执行#include“tchar.h”,但我已经尝试对该库进行评论,并且奇怪之处仍然存在。
[1] http://www.cplusplus.com/files/winbmp.zip
编辑:有些人正在为解决方案提供建议 - 我很欣赏 - 但大多数情况下我在这里问是否有人知道魔鬼究竟发生了什么?再次编辑:James Kanze解决了问题。
循环已更改为:
for (int i = 0; i<(bmp.BytesPerRow*bmp.Height);i++) // once per color per pixel
{
if(i%3==0) // one line between each pixel
{
cout << "\n";
}
uint8_t tmp0 = (uint8_t)bmp.Raster[i];
uint16_t tmp1 = (uint16_t)tmp0;
cout << "\nbmp.Raster[" << i << "]": " << hex << tmp1;
}
现在输出正确。
答案 0 :(得分:1)
不是这个:
int tmp = (int) bmp.Raster[i];
但是这个:
int tmp = (unsigned int) bmp.Raster[i]; // OR
unsigned int tmp = bmp.Raster[i];
可能有用。
当您将字节值转换为(带符号)int时,字节的符号位(高位)会传播以填充整数的上半部分。所以(比方说)0x80的字节变成像0xffffff80这样的int。无符号算术会产生您想要的行为。
答案 1 :(得分:1)
问题是您机器上的普通字符已签名。 (如果 你不太关心g ++和VC ++的可移植性 有选项使普通字符无符号。)你需要先 将char转换为unsigned char,然后将unsigned char转换为 INT。或者,如果您可以更改数据结构 输出,更改它们以使用unsigned char;这似乎更多 适用于像位图这样的东西。
答案 2 :(得分:0)
使用此行:
unsigned char tmp = bmp.Raster[i];
而不是:
int tmp = (int) bmp.Raster[i];
它可能会奏效。