【问题标题】:Dummy output from an unsigned char buffer无符号字符缓冲区的虚拟输出
【发布时间】:2019-12-29 11:20:42
【问题描述】:

我正在使用 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里面的buffer定义:

unsigned char buf2[32];

【问题讨论】:

  • 是什么让你认为它是“虚拟”输出?
  • 事实上,当您查看字符串的二进制格式时,它似乎是正确的。但是,输出二进制是相反的。有关输出函数行为的更多信息,请参阅其他 cmets。谢谢
  • 我读过它们 - 我试图教你不要将意外输出视为“虚拟”输出:)

标签: c++ file char buffer


【解决方案1】:

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

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

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

要在输出中获取数字,值应输出为整数,而不是字符。感谢integral promotion+vunsigned char 转换为unsigned int。你可以更明确地使用它并使用static_cast&lt;unsigned int&gt;(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) << ' ';

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

【讨论】:

  • 非常感谢您的回复!我不期待十六进制,输出只是二进制,但我对输出有点震惊。我想通过转换读取相同的二进制输出而不进行任何更改。有没有办法以二进制打印输出?非常感谢
  • 另外,输出反了!比如输入是:1 27 31 4 156,输出打印为156 4 31 27 1!有没有办法解决这个问题?谢谢
  • 我使用以下二进制打印:std::cout (static_cast(v))
  • @MHDAnasAlsakkal,循环本身不会反转输出,但它可能会由于字节序而反转,例如。
  • 这太完美了!!它可以通过反转位顺序正常工作。非常感谢^_^。
猜你喜欢
  • 2010-10-13
  • 1970-01-01
  • 2015-02-09
  • 2016-03-09
  • 2019-09-26
  • 1970-01-01
  • 2012-01-18
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多