【问题标题】:Hexadecimal to string conversion in C++ [closed]C ++中的十六进制到字符串转换[关闭]
【发布时间】:2014-01-01 00:20:26
【问题描述】:

假设我有一个长值 3074109543 我需要将其转换为十六进制,得到 b73b3067(32 位)。

我正在尝试以不超过 4 个字节的字符串格式表示这个十六进制值。

转换为字符串后,是否可以在第一个字节中表示b7,在第二个字节中表示3b,在第三个字节中表示30等等。 我正在研究 C++ 中的按位运算逻辑,并且可以想到任何足够有价值的东西。 请提出一些伪代码。

【问题讨论】:

  • 查找将 int 转换为 char[4],例如 stackoverflow.com/questions/15858256/…
  • 您不会同时获得每个字节 字符串格式的 2 位数字。您的数字表示中的每个字节已经 有两个数字(或者至少很有可能,无论如何)。如果您希望它采用字符串格式,您需要为每个 char 支付一位数字的价格,从而有效地将所需的存储大小翻倍(不包括终止符)。
  • 另外,3074109543/b73b3067 不适合 32 位长,除非您的意思是无符号长 :)
  • 如何将字符串“b73b3067”放入“不超过 4 个字节”的字符串中?这么说已经有矛盾了。

标签: c++ bit-manipulation hex


【解决方案1】:

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

【讨论】:

  • +1 第一句我想你的意思是 digit;不是性格。然而,我可能错了。
  • 十六进制字符将是一个数字。我想强调它是一个字符的事实,因为它占据 8 位这一事实对我的其余论点至关重要。
  • 好的。重读 second 句子使那个凝胶。很抱歉造成混乱。
【解决方案2】:
{
    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;

【讨论】:

  • 一般来说答案不错;在我看来,使用 C++11 功能过于复杂,因为 OP 似乎是 C/C++ 的新手。
  • 来自莫斯科的@Vlad -- “c1” 的值不是在这里被覆盖了吗??
  • 我没明白你的意思。形成 c1 以获得十六进制值的字符表示。 c1 是一个局部变量,用于在控制台上进行相应的转换以输出十六进制数字的内部表示。
  • 我很欣赏这里应用的逻辑。但是根据我在想的问题,是否可以在第一个字节中表示 b7,在第二个字节中表示 3b,在第三个字节中表示 30 等等。稍后将此值存储在一个不超过 4 个字节的字符串中。
  • 我展示了相关代码。我觉得够了。
【解决方案3】:

我正在尝试以不超过 4 个字节的字符串格式表示 [b73b3067 hex]。

转换成字符串后是否可以在第一个字节表示b7,在第二个字节表示3b,在第三个字节表示30等等。

如果您将“字符串”的正常含义用作一些可打印的、人类可读的文本,则不会。 如果您将 b7 放在第一个字节中,将 3b 放在第二个字节中,等等,您刚刚重新创建了您开始使用的二进制数 - 尽管字节顺序可能发生了变化。没有什么有意义的“字符串”——比如这个……你不能把它写到终端或文件然后读取它,因为我们可以在屏幕上读取“b73b3067”。如果您对这种区别感到困惑,您可能想了解 ASCII 字符编码:http://en.wikipedia.org/wiki/ASCII

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

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

【讨论】:

    猜你喜欢
    • 2012-01-24
    • 2018-01-31
    • 1970-01-01
    • 2020-03-22
    • 2010-11-18
    • 2011-11-12
    • 2017-08-12
    • 2013-03-20
    • 2013-07-12
    相关资源
    最近更新 更多