Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/142.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 正在将\x00写入文件_C++_Hex - Fatal编程技术网

C++ 正在将\x00写入文件

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()); 什么也没

我必须向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());
什么也没发生

以及:

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