来自无符号字符缓冲区的虚拟输出

Dummy output from an unsigned char buffer

本文关键字:虚拟 输出 缓冲区 字符 无符号      更新时间:2023-10-16

我正在使用C++码通过USB从电子板读取一些二进制输出。输出存储在无符号字符缓冲区中。当我尝试打印出值或将其写入输出文件时,我得到的是虚拟输出而不是十六进制和二进制值,如下所示:

햻"햻"㤧햻"㤧햻"햻"㤧

这是输出文件声明:

f_out.open(outfilename, ios::out);
if (false == f_out.is_open()) {
printf("Error: Output file could not be opened.n");
return(false);
}

这是输出命令:

xem->ReadFromPipeOut(0xA3, 32, buf2);
f_out.write((char*)buf2, 32);
//f_out << buf2;

"xem"是USB通信的一个类。ReadFromPipeOut 方法,从电路板读取输出并将其存储在缓冲区 buf2 上。这是 main 内部的缓冲区定义:

unsigned char buf2[32];

为什么期望十六进制输出?你要求写chars,它写chars。

要输出十六进制值,您可以执行以下操作:

f_out << std::hex;
for (auto v : buf2)
f_out << +v << ' ';

若要在输出中获取数字,值应输出为整数,而不是字符。+v通过整体推广将unsigned char转化为unsigned int。您可以更明确地使用它并使用static_cast<unsigned int>(v).

unsigned char buf[3] = {0x12, 0x34, 0x56};
std::cout << std::hex;
for (auto v : buf)
std::cout << static_cast<unsigned int>(v) << ' ';
// Output: 12 34 56

以二进制形式输出数字:

for (auto v : buf)
std::cout << std::bitset<8>(v) << ' ';

(这里不需要std::hexstatic_cast(

要颠倒顺序:

for (auto it = std::rbegin(buf); it != std::rend(buf); ++it)
std::cout << std::bitset<8>(*it) << ' ';

请注意,多字节整数中的字节顺序取决于字节序。在小端机器上,订单是保留的。