首页 > 解决方案 > 无符号字符缓冲区的虚拟输出

问题描述

我正在使用 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];

标签: c++filecharbuffer

解决方案


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

要输出十六进制值,您可以这样做:

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

要在输出中获取数字,值应输出为整数,而不是字符。+v转化unsigned charunsigned 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) << ' ';

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


推荐阅读