如何将十六进制值的二进制数组转换为十进制,然后转换为字符串

时间:2010-01-07 13:22:39

标签: c++

我有一个带十六进制值的二进制数组,我想将其转换为十进制数。一旦完成,我想将它显示在一个字符串中。

顺便说一下,我正在通过ubuntu开发一个intel进程,这可能会在sun太多hp unix box上使用。

当我对unsigned long进行直接赋值时,它可以正常工作......就像在小数部分一样。我还没有把它变成一个字符串,但我不确定它为什么会起作用。此外,我读到某个地方,当你把它放在unsigned long时,你不必担心endianess。

我可以获得一些关于如何解决这个问题的帮助以及上述原因的原因吗?

请注意:我使用的是c ++,而不是.net的东西,所以bitconverter不可用。

编辑(从下面自己的问题回答复制)

首先感谢IBM文章真正帮助的endian链接。我知道我只是将它放入寄存器而不是手动将字节值放在连续的存储器位置,这就意味着整个endianess问题带来了很大的不同。

这是我写的一段代码,我知道它可以更好但是它只是快速的东西......

// use just first 6 bytes
byte truncHmac[6];
memset( truncHmac, 0x00, 6 );
unsigned long sixdigit[6];
for (int i=0; i<=5; i++)
{
    truncHmac[i]=hmacOutputBuffer[i];
    sixdigit[i]=truncHmac[i];
    std::cout<<sixdigit[i]<< std::endl;
}

输出

HMAC: 76e061dc7512be8bcca2dce44e0b81608771714b
118
224
97
220
117
18

有意义的是它占用前六个字节并将它们转换为小数。

我现在唯一的问题是如何将其变成字符串。有人提到使用操纵器?我可以举个例子吗?

5 个答案:

答案 0 :(得分:2)

每行四个空格缩进代码会使其显示为代码:

// use just first 6 bytes
byte truncHmac[6];
memset( truncHmac, 0x00, 6 );
unsigned long sixdigit[6];

for (int i=0; i<=5; i++)
{
    truncHmac[i]=hmacOutputBuffer[i];
    sixdigit[i]=truncHmac[i];
    std::cout<<sixdigit[i]<< std::endl;
}

点击编辑框右上方的橙色?以获取标记帮助。

对于操纵者,请使用stringstream代替cout

#include <sstream>

stringstream strs;

for (int i = 0; i < 6; ++i)
{
    strs << hex << hmacOutputBuffer[i] << std::endl;
}

strs.str(); // returns a string object.

编辑:当你需要处理C ++迭代器时,将循环写为for (int i = 0; i < N; ++i)而不是for (int i = 0; i <= N - 1; ++i)对你来说会更好,它将结尾定义为“超过最后一个有效元素”。

此外,MAC地址通常在每个字节之间放置-:个字符。不推荐使用:,因为IPv6地址也使用:

答案 1 :(得分:1)

hex,decimal和char只是呈现值的另一种方式。 由您的应用程序决定如何解释该值。

答案 2 :(得分:1)

您可能希望阅读C ++ iostream manipulators,特别是在hex上。

答案 3 :(得分:1)

您应该阅读Endianness

IBM在endianness in practice上有一篇很好的文章。

答案 4 :(得分:0)

首先感谢IBM文章真正帮助的endian链接。我知道我只是将它放入寄存器而不是手动将字节值放在连续的存储器位置,这就意味着整个endianess问题带来了很大的不同。

这是我编写的一段代码,我知道它可以更好但它只是快速...

// use just first 6 bytes
byte truncHmac[6];
memset( truncHmac, 0x00, 6 );
unsigned long sixdigit[6];
for (int i=0; i<=5; i++)
{
    truncHmac[i]=hmacOutputBuffer[i];
    sixdigit[i]=truncHmac[i];
    std::cout<<sixdigit[i]<< std::endl;
}

输出

HMAC: 76e061dc7512be8bcca2dce44e0b81608771714b
118
224
97
220
117
18

有意义的是它占用前六个字节并将它们转换为小数。

我现在唯一的问题是如何将它变成一个字符串。有人提到使用操纵器吗?我能得到一个例子吗?

谢谢你们所有人摇摇欲坠!