您只是想发送二进制而不是文本数据,但是,二进制数据不能以与文本字符串相同的方式处理,因为 0 (0x00) 是合法的二进制值,而它在 C 中充当字符串终止符。这就是为什么二进制数据协议通常在一个字节中具有长度指示符(如果消息可以具有可变长度)或特定的消息分隔符(消息开头和结尾处的唯一值,不能在消息数据中重复) 。
关于您的代码的指针:
尽可能初始化值,尤其是要存储字符串的数组,例如char buffer[2000] = {0}
如果编译器允许的话memset(buffer, 0, sizeof(buffer);
在使用它之前。
unsigned char str[13] = {0xA5,0x80,0x90,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xBD};
这里有一个隐式的强制转换signed int
to an unsigned char
对于您正在初始化数组的值,例如0x90
is an int
默认情况下。
write(fd, str, strlen(str));
正如所指出的0x00
(null) 是一个合法的二进制值,但恰好是 C 中的文本字符串终止符,因此strlen(str)
将返回 4,因为它需要0xA5, 0x80, 0x90, 0x08, 0x00
作为您的字符串,包含 4 个数据字节和 1 个终止符。对于存储字符串的数组,必须留出一个额外的字节来放置空终止符。
相反,你应该使用类似的东西:
write(fd, str, sizeof(str)/sizeof(str[0]));
这将计算数组中的元素数量。作为sizeof
将返回正在调整大小的项目占用的内存字节数(八位字节),我们还需要将其除以数组元素的大小以确定元素的数量。
A char
将返回大小 1,int
在 16 位处理器上编译时可以返回 2 的大小,如果在 32 位处理器上编译则返回 4 等。
最后,您需要转换正在打印的值,因此请尝试使用:(编辑:进行了代码更正)
unsigned char str[13] = {0xA5,0x80,0x90,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xBD};
for (int i=0; i< sizeof(str)/sizeof(str[0]); i++)
{
printf("%X",(int)str[i]);
}
printf("\n");
会给
A58090800000000BD