下面的代码采用十六进制字符串(每个字节表示为其对应的十六进制值) 将其转换为unsigned char * buffer,然后转换回十六进制字符串。 此代码测试从unsigned char * buffer到hex string的转换 我需要通过网络发送到接收器进程。 我选择了十六进制字符串,因为unsigned char可以在0到255的范围内,127之后没有可打印的字符。 下面的代码告诉我错误的部分。它在评论中。
seekg()
答案 0 :(得分:1)
unsigned char
的输出类似于char
的输出,这显然不是OP所期望的。
我在coliru上测试了以下内容:
#include <iomanip>
#include <iostream>
int main()
{
std::cout << "Output of (unsigned char)0xc0: "
<< std::hex << std::setw(2) << std::setfill('0') << (unsigned char)0xc0 << '\n';
return 0;
}
得到了:
Output of (unsigned char)0xc0: 0�
这是由可用运算符中选择的std::ostream::operator<<()
引起的。我查看了cppreference
找到了
template< class Traits >
basic_ostream<char,Traits>& operator<<( basic_ostream<char,Traits>& os,
unsigned char ch );
在前者(在M.M的帮助下)。
OP提出了一个解决方案:按位并且0xff
似乎有效。在coliru.com中检查:
#include <iomanip>
#include <iostream>
int main()
{
std::cout << "Output of (unsigned char)0xc0: "
<< std::hex << std::setw(2) << std::setfill('0') << (0xff & (unsigned char)0xc0) << '\n';
return 0;
}
输出:
Output of (unsigned char)0xc0: c0
真的,这似乎有效。为什么呢?
0xff
是int
常量(严格来说:integer literal)并且类型为int
。因此,逐位并将(unsigned char)0xc0
提升为int
,产生类型int
的结果,因此应用std::ostream::operator<<
的{{1}}
这是解决此问题的选项。我可以提供另一个 - 只需将int
转换为unsigned char
。
unsigned
促销unsigned char
引入了可能的符号位扩展(在这种情况下是不受欢迎的),当int
转换为unsigned char
时,这不会发生unsigned
。 unsigned
的输出流运算符也提供了预期的输出:
#include <iomanip>
#include <iostream>
int main()
{
std::cout << "Output of (unsigned char)0xc0: "
<< std::hex << std::setw(2) << std::setfill('0') << (unsigned)(unsigned char)0xc0 << '\n';
const unsigned char c = 0xc0;
std::cout << "Output of unsigned char c = 0xc0: "
<< std::hex << std::setw(2) << std::setfill('0') << (unsigned)c << '\n';
return 0;
}
输出:
Output of (unsigned char)0xc0: c0
Output of unsigned char c = 0xc0: c0