使用 stringstream 格式化 signed char 或 unsigned char
Format signed char or unsigned char with stringstream
以下代码未按预期工作:
#include <iostream>
#include <string>
#include <sstream>
#include <iomanip>
#include <cstdint>
int main()
{
std::stringstream ss;
ss << std::setfill('0') << std::hex << std::setw(2) << std::int8_t(-1);
std::cout << ss.str() << std::endl;
}
我想要的是将带符号的字符转换为固定长度的十六进制表示形式。输出始终为 0�.
转换为 unsigned int 也会打印意外输出:
ss << std::setfill('0') << std::hex << std::setw(2) << (unsigned int)std::int8_t(-1);
这将打印正确的 ffffffff,但我告诉流将宽度设置为 2。有什么办法可以解决这个问题吗?
您需要先转换为 unsigned char,以获得 0-255 范围内的值:
ss << std::setfill('0') << std::hex << std::setw(2) << (int)std::uint8_t(-1);
然后将其转换为任何大于 char
的整数类型(此处为 int
),以使其打印为数字而不是字符。
您必须将 -1
转换为 uint8_t
以获得 255
,转换为 unsigned int
将停留在 255
,然后打印为ff
:
ss << std::setfill('0') << std::hex << std::setw(2) << (unsigned int)std::uint8_t(-1);
当你将它转换为 int8_t
时,它将停留在 -1
,转换为 unsigned int
将得到 4294967295
,然后将打印为 ffffffff
.
以下代码未按预期工作:
#include <iostream>
#include <string>
#include <sstream>
#include <iomanip>
#include <cstdint>
int main()
{
std::stringstream ss;
ss << std::setfill('0') << std::hex << std::setw(2) << std::int8_t(-1);
std::cout << ss.str() << std::endl;
}
我想要的是将带符号的字符转换为固定长度的十六进制表示形式。输出始终为 0�.
转换为 unsigned int 也会打印意外输出:
ss << std::setfill('0') << std::hex << std::setw(2) << (unsigned int)std::int8_t(-1);
这将打印正确的 ffffffff,但我告诉流将宽度设置为 2。有什么办法可以解决这个问题吗?
您需要先转换为 unsigned char,以获得 0-255 范围内的值:
ss << std::setfill('0') << std::hex << std::setw(2) << (int)std::uint8_t(-1);
然后将其转换为任何大于 char
的整数类型(此处为 int
),以使其打印为数字而不是字符。
您必须将 -1
转换为 uint8_t
以获得 255
,转换为 unsigned int
将停留在 255
,然后打印为ff
:
ss << std::setfill('0') << std::hex << std::setw(2) << (unsigned int)std::uint8_t(-1);
当你将它转换为 int8_t
时,它将停留在 -1
,转换为 unsigned int
将得到 4294967295
,然后将打印为 ffffffff
.