c++ - 无符号字符缓冲区的虚拟输出
问题描述
我正在使用 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];
解决方案
为什么你期望十六进制输出?你要求写char
s,它写char
s。
要输出十六进制值,您可以这样做:
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::hex
和static_cast
这里)
颠倒顺序:
for (auto it = std::rbegin(buf); it != std::rend(buf); ++it)
std::cout << std::bitset<8>(*it) << ' ';
请注意,多字节整数中的字节顺序取决于 endian-ness。在 little-endian 机器上,订单是保留的。
推荐阅读
- c# - 启动流程并不断获取其输出
- node.js - 挂起 Jenkins 构建的成功测试
- swift - 如果 NSNumber 是从字符串创建的,如何对 NSNumber 数组进行排序
- google-docs - 是否可以更改谷歌工作区中每个用户的所有文档的默认字体?
- swiftui - 无法打开具有不同尾部的深度链接小部件 SwiftUI
- java - 无法在 Windows VM 上启动声纳
- android - java.lang.NoSuchMethodError:没有静态方法'myMethod'
- java - 手动配置构建路径时导入未解决
- python - 如何在 python 中打印 matrix[i][j]?
- pandas - 为什么有些 pandas 聚合函数在引号中,而另一些则不是?