C++ 正在将\x00写入文件
我必须向USB设备发送一个十六进制命令 命令是:C++ 正在将\x00写入文件,c++,hex,C++,Hex,我必须向USB设备发送一个十六进制命令 命令是: echo -en "\x1b\x70\x00\x19\xfa" > /dev/usb/lp0 如果我把它写在终端上,它就会工作。然而,C++中的十六进制命令存在一个问题。代码>\x00被检测为以null结尾的字符串 我尝试了两种方法: std::string cmd = "echo '\\x1b\\x70\\x00\\x19\\xfa' > /dev/usb/lp0"; std::system(cmd.c_str()); 什么也没
echo -en "\x1b\x70\x00\x19\xfa" > /dev/usb/lp0
如果我把它写在终端上,它就会工作。然而,C++中的十六进制命令存在一个问题。代码>\x00被检测为以null结尾的字符串
我尝试了两种方法:
std::string cmd = "echo '\\x1b\\x70\\x00\\x19\\xfa' > /dev/usb/lp0";
std::system(cmd.c_str());
什么也没发生
以及:
std::流设备;
device.open(“/dev/usb/lp0”);
设备使用函数写入固定长度的字节
由于您正在编写二进制数据,我建议您也以二进制模式打开文件,并编写实际的整数值,而不是字符串
示例代码
std::ofstream device ("/dev/usb/lp0",std::ofstream::binary);
std::uint8_t const message[] = { 0x1b, 0x70, 0x00, 0x19, 0xfa };
if (device)
device.write(reinterpret_cast<char const*>(message), sizeof message);
std::ofstream设备(“/dev/usb/lp0”,std::ofstream::binary);
std::uint8_t const message[]={0x1b,0x70,0x00,0x19,0xfa};
如果(设备)
设备写入(重新解释广播(消息),消息大小);
使用该函数写入固定长度的字节
由于您正在编写二进制数据,我建议您也以二进制模式打开文件,并编写实际的整数值,而不是字符串
示例代码
std::ofstream device ("/dev/usb/lp0",std::ofstream::binary);
std::uint8_t const message[] = { 0x1b, 0x70, 0x00, 0x19, 0xfa };
if (device)
device.write(reinterpret_cast<char const*>(message), sizeof message);
std::ofstream设备(“/dev/usb/lp0”,std::ofstream::binary);
std::uint8_t const message[]={0x1b,0x70,0x00,0x19,0xfa};
如果(设备)
设备写入(重新解释广播(消息),消息大小);
我建议使用无符号字符数组来存储命令,而不是使用C字符串或std::字符串:
const unsigned char usb_cmd[] = { 0x1b, 0x70, 0x00, 0x19, 0xfa };
通过这种方式,读者很明显,这是二进制协议中的消息,而不是文本,也不是以nul结尾的字符串。同样,以这种方式声明,sizeof(usb\u cmd)
将是正确的写入字节数,而不是一个,也不是sizeof(char*)
。如果需要在运行时更改命令的内容,请改用向量
我还将使用操作系统原语对设备进行实际写入:
int fd = open("/dev/usb/lp0", O_RDWR);
if (fd == -1) {
perror("/dev/usb/lp0");
return -1;
}
ssize_t nwritten = write(fd, usb_cmd, sizeof usb_cmd);
if ((size_t)nwritten != sizeof usb_cmd) {
if (nwritten < 0) {
perror("/dev/usb/lp0: write error");
} else {
fprintf(stderr, "/dev/usb/lp0: short write (%zu of %zu bytes)\n",
(size_t)nwritten, sizeof usb_cmd);
}
close(fd);
return -1;
}
close(fd);
return 0;
intfd=open(“/dev/usb/lp0”,O_RDWR);
如果(fd==-1){
perror(“/dev/usb/lp0”);
返回-1;
}
ssize_t nwrite=write(fd、usb_cmd、sizeof usb_cmd);
如果((大小)未写入!=sizeof usb\u cmd){
如果(nwrited<0){
perror(“/dev/usb/lp0:写入错误”);
}否则{
fprintf(stderr,“/dev/usb/lp0:短写(%zu,共%zu字节)\n”,
(大小为nwrited,大小为usb\u cmd);
}
关闭(fd);
返回-1;
}
关闭(fd);
返回0;
这样,您可以确保一次写入的字节数准确无误;没有编码层或缓冲层可进行干扰。我建议使用无符号字符数组来存储命令,而不是使用C字符串或std::string:
const unsigned char usb_cmd[] = { 0x1b, 0x70, 0x00, 0x19, 0xfa };
通过这种方式,读者很明显,这是二进制协议中的消息,而不是文本,也不是以nul结尾的字符串。同样,以这种方式声明,sizeof(usb\u cmd)
将是正确的写入字节数,而不是一个,也不是sizeof(char*)
。如果需要在运行时更改命令的内容,请改用向量
我还将使用操作系统原语对设备进行实际写入:
int fd = open("/dev/usb/lp0", O_RDWR);
if (fd == -1) {
perror("/dev/usb/lp0");
return -1;
}
ssize_t nwritten = write(fd, usb_cmd, sizeof usb_cmd);
if ((size_t)nwritten != sizeof usb_cmd) {
if (nwritten < 0) {
perror("/dev/usb/lp0: write error");
} else {
fprintf(stderr, "/dev/usb/lp0: short write (%zu of %zu bytes)\n",
(size_t)nwritten, sizeof usb_cmd);
}
close(fd);
return -1;
}
close(fd);
return 0;
intfd=open(“/dev/usb/lp0”,O_RDWR);
如果(fd==-1){
perror(“/dev/usb/lp0”);
返回-1;
}
ssize_t nwrite=write(fd、usb_cmd、sizeof usb_cmd);
如果((大小)未写入!=sizeof usb\u cmd){
如果(nwrited<0){
perror(“/dev/usb/lp0:写入错误”);
}否则{
fprintf(stderr,“/dev/usb/lp0:短写(%zu,共%zu字节)\n”,
(大小为nwrited,大小为usb\u cmd);
}
关闭(fd);
返回-1;
}
关闭(fd);
返回0;
这样,您可以确保一次写入的字节数准确无误;没有编码层或缓冲层可以干扰。不要忘记需要在字符串文本中转义反斜杠。不要忘记需要在字符串文本中转义反斜杠。谢谢您的回答。你能举个例子吗?所以std::ofstream设备(“/dev/usb/lp0”,std::ofstream::binary)以二进制形式写入。write函数会是怎样的?@grouser添加了一个示例。它给出了从'uint8_t*{aka unsigned char*}'到'const char*的无效转换错误。如果要这样做,我建议添加device.rdbuf()->pubsetbuf(0,0)代码>就在设备
实例化之后,这样就不会有流缓冲区干扰。这很有效!非常感谢你们两位,@Someprogrammerdude和zwol谢谢你们的回答。你能举个例子吗?所以std::ofstream设备(“/dev/usb/lp0”,std::ofstream::binary)以二进制形式写入。write函数会是怎样的?@grouser添加了一个示例。它给出了从'uint8_t*{aka unsigned char*}'到'const char*的无效转换错误。如果要这样做,我建议添加device.rdbuf()->pubsetbuf(0,0)代码>就在设备
实例化之后,这样就不会有流缓冲区干扰。这很有效!非常感谢你们两位,@Someprogrammerdude和zwol