经过几个小时的工作后,我可以在激活扩展程序时运行扩展程序和主机应用程序,但每当我尝试接收数据时,都会得到未定义。
这是我的代码:
int main(int argc, char* argv[]) {
char message[] = "{\"t\": \"t\"}";
unsigned int len = strlen(message);
_setmode(_fileno(stdout), _O_BINARY);
printf("%c%c%c%c", (char) 10, (char) 0, (char) 0, (char) 0);
printf("%s", message);
return 0;
}
我做错了什么?
答案 0 :(得分:1)
%c
需要int
个参数(内向为unsigned char
),而不是char
。这可能/将导致打印错误的数据。此外,strlen
还会返回size_t
。您应该阅读您使用的函数的手册页。
重要提示:传递二进制值(不是字符)时,您应该使用uint8_t
或 - 至少unsigned char
。请记住,char
可以是签名或未签名,具体取决于实现。这可能会导致算术运算出现意外。
注意:
printf("%c%c%c%c", (char) 10, (char) 0, (char) 0, (char) 0);
printf("%s", message);
可以组合(删除演员表):
printf("%c%c%c%c%s", 10, 0, 0, 0, message);
如果没有要支持的库,你应该考虑编写一些函数来序列化一些基本类型,如:
static void print_u32(uint32_t value)
{
for ( size_t n = 0 ; n < 4 ; n-- ) {
putc((unsigned char)value); // still passing an int !
value >>= 8;
}
}
... print_string( ...
print_u32(strlen(message));
print_string(message);
请注意,_setmode
不是标准库函数。经过一些谷歌搜索后,它似乎也是Windows支持的BSD扩展(以防您希望该扩展程序是可移植的。)