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

C++ C+中的十六进制到字符串转换+;,c++,bit-manipulation,hex,C++,Bit Manipulation,Hex,假设我有一个长值3074109543 我需要将其转换为十六进制,即b73b3067(32位) 我试图用不超过4个字节的字符串格式来表示这个十六进制值 转换为字符串后,是否可以在第一个字节中表示b7,在第二个字节中表示3b,在第三个字节中表示30,依此类推。 我在C++中用位元运算来处理逻辑,并能想到任何有价值的东西。 请推荐一些伪码。一个十六进制字符代表4位。C++中的一个字节至少是8位。因此,您至少需要2个字符来表示十六进制的单个字节。这是基础数学,没有办法。如果long为4个字节,则至少需要

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

我试图用不超过4个字节的字符串格式来表示这个十六进制值

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

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

{
无符号整数x=3074109543;
std::cout>=8;返回c;});
用于(字符c:s)
{
字符c1=(c&0xF0)>>4;
c1+=c1<10?'0':'A'-10;
标准::cout
我试图用不超过4个字节的字符串格式来表示[b73b3067 hex]

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

如果您将“字符串”的正常含义用作可打印、人类可读的文本,则不会这样做。如果您将b7放在第一个字节中,将3b放在第二个字节中,则您刚刚重新创建了以开头的二进制数。-尽管可能更改了字节顺序。没有任何有意义的“字符串”-类似于此……您不能将其写入终端或文件,然后读取它,就像我们可以在屏幕上读取“b73b3067”一样。如果您对这一区别感到困惑,您可能需要阅读有关ASCII字符编码的内容:

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

#包括

std::cout+1第一句我想你指的是数字,而不是字符。不过,我可能错了。十六进制字符就是数字。我想坚持这是一个字符的事实,因为它占8位的事实对我的其余论点至关重要。好吧。重读第二句话会让你感到困惑。sryp将整型转换为字符[4],例如,不能同时获得每个字节2位数字和字符串格式。在数字表示中,每个字节已经有两位数字(或者至少很可能是这样)。如果您想要字符串格式,您将支付每个
字符一个数字的价格,有效地将您所需的存储大小(不包括终止符)增加一倍。此外,3074109543/b73b3067不适合32位长,除非您指的是无符号长:)如何将字符串“b73b3067”适合一个字符串“不超过4字节”?用这种方法已经包含了矛盾。一般的回答是很好的;在我看来,使用C++ 11的特征过于复杂,因为OP似乎是C/C++的新。@来自莫斯科的弗拉德——不是C1的值。"这里被覆盖??我不明白你的意思。c1是用来获取十六进制值的字符表示形式的。c1是一个局部变量,用于在控制台上相应地转换为十六进制数字的输出内部表示形式。我欣赏这里应用的逻辑。但根据我思考的问题如果可以在第一个字节中表示b7,在第二个字节中表示3b,在第三个字节中表示30,依此类推。然后将此值存储在不超过4个字节的字符串中。我显示了相关代码。我认为这就足够了。
{
    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;
}
    x = std::accumulate( s.begin(), s.end(), 0u,
        [](unsigned int acc, char c ) { return ( ( acc << 8 ) | c ); } );

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