说我有一个很长的值3074109543 我需要将其转换为十六进制,这给出了b73b3067(32位)。
我试图以字符串格式表示这个十六进制值,该格式不超过4个字节。
转换为字符串后,是否可以在第1个字节中表示b7,在第2个字节中表示3b,在第3个字节中表示30个,依此类推。 我正在使用按位运算来处理C ++中的逻辑,并且可以想到任何有价值的东西。 请建议一些伪代码。
答案 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::cout
或std::ostringstream
的输出流,IO操纵器函数std::hex
。如果您想要特定的宽度和初始填充/填充字符,例如Google std::setw
和/或std::setfill
,例如“000012CD”为“8”和“0”。
#include <iomanip>
std::cout << std::hex << my_number;