2012-02-10 308 views
0

我正在阅读二进制文件(在C++中)。和报头是这样的(以十六进制印刷)二进制文件解释

43 27 41 1A 00 00 00 00 23 00 00 00 00 00 00 00 04 63 68 72 31 FFFFFFB4 01 00 00 04 63 68 72 32 FFFFFFEE FFFFFFB7

在打印时使用:

std::cout << hex << (int)mem[c]; 

是否有存储23一种有效的方式,其是9th字节转换成一个整数,而无需使用stringstream(?)?或者是stringstream最好的方法?

喜欢的东西

int n= mem[8] 

我想存储23n35

+1

什么'mem':在这种情况下,你可以使用类似转换? – PlasmaHH 2012-02-10 10:02:13

+1

当值为'1A'时,你想存储什么? – 2012-02-10 10:07:45

+0

mem是 char * mem; – Robert 2012-02-10 11:09:02

回答

1

你的意思是你想把这个值当作二进制编码的十进制吗?

unsigned char bcd = mem[8]; 
unsigned char ones = bcd % 16; 
unsigned char tens = bcd/16; 

if (ones > 9 || tens > 9) { 
    // handle error 
} 

int n = 10*tens + ones; 
5

您确实在n店23。您只能看到35,因为您正在输出一个将其转换为十进制显示的例程。如果你可以看一下计算机内部的二进制数据,你会看到,它实际上是一个十六进制23

你会得到相同的结果,如果你这样做:

int n=0x23; 

(你可能认为你想要的是不可能的。n对于1E应该存储什么数字?唯一对应的数字是31,这就是你正在得到的。)

+0

如果你可以查看二进制数据,你会发现它实际上是'0000 0000 0010 0011'(或者'0011 0010 0000 0000',或者等于64位等等)。它已被转换成十六进制格式显示它,因为它将以十进制显示。我总是发现指出这一点有助于人们理解在整型变量中没有固有的基数(二进制除外)。 – 2012-02-10 10:13:31

+0

我在答案的草稿中实际上已经有了这个,但是找不到让它易于理解的方法。但你说得很对,这是一个重要的观点。 – 2012-02-10 10:19:24

+0

我明白这一点,但我实际上想在代码中使用数字23。那么如何能够例如循环23次而不是35次(这是我得到的数字)。 – Robert 2012-02-10 11:03:48