C ++中的十六进制到字符串转换

时间:2013-12-13 09:25:56

标签: c++ bit-manipulation hex

说我有一个很长的值3074109543 我需要将其转换为十六进制,这给出了b73b3067(32位)。

我试图以字符串格式表示这个十六进制值,该格式不超过4个字节。

转换为字符串后,是否可以在第1个字节中表示b7,在第2个字节中表示3b,在第3个字节中表示30个,依此类推。 我正在使用按位运算来处理C ++中的逻辑,并且可以想到任何有价值的东西。 请建议一些伪代码。

3 个答案:

答案 0 :(得分:1)

单个十六进制字符代表4位。 C ++中的一个字节至少为8位。因此,您需要至少2个字符来表示十六进制的单个字节。那是基础数学,没有办法绕过它。如果long为4个字节,则至少需要8个字符(字节),如果long为8个字节,则至少需要16个字符。 (在long为一个字节的机器上,一个字节必须至少为32位,因此至少需要8个字符才能表示单个字节。)

答案 1 :(得分:1)

{
    unsigned int x = 3074109543;

    std::cout << x << '\t';

    std::string s( sizeof( unsigned int ), '\0' );

    std::generate( s.rbegin(), s.rend(), 
        [=] () mutable ->char { char c = 0xFF & x; x >>= 8; return c; } );

    for ( char c : s )
    {
        char c1 = ( c & 0xF0 ) >> 4;
        c1 += c1 < 10 ? '0' : 'A' - 10;
        std::cout << c1;
        c1 = c & 0x0F;
        c1 += c1 < 10 ? '0' : 'A' - 10;
        std::cout << c1;
    }

    std::cout << std::endl;
}

输出

3074109543 B73B3067

反向操作

    x = std::accumulate( s.begin(), s.end(), 0u,
        [](unsigned int acc, char c ) { return ( ( acc << 8 ) | c ); } );

    std::cout << x << std::endl;

答案 2 :(得分:0)

  

我试图以字符串格式表示[b73b3067 hex],该格式不超过4个字节。

     

在转换为字符串后,是否可以在第1个字节中表示b7,在第3个字节中表示3b,在第3个字节中表示30个,依此类推。

如果您使用“string”的正常含义作为某些可打印的人类可读文本,则不会。 如果你将b7放在第一个字节中,3b放在第二个字节中,你刚刚重新创建了你用开头的二进制数字 - 尽管可能改变了字节顺序。没有什么有意义的“字符串” - 就像这样......你不能把它写到终端或文件然后读它,因为我们可以在屏幕上看到“b73b3067”。如果您对这种区别感到困惑,可能需要阅读有关ASCII字符编码的信息:http://en.wikipedia.org/wiki/ASCII

要获得数字的可读字符串表示形式,您可以使用诸如std::coutstd::ostringstream的输出流,IO操纵器函数std::hex。如果您想要特定的宽度和初始填充/填充字符,例如Google std::setw和/或std::setfill,例如“000012CD”为“8”和“0”。

#include <iomanip>
std::cout << std::hex << my_number;