C语言中如何将short类型转换为unsigned char *buf供lws_write发送
实现方案
你需要先申请符合libwebsockets要求的缓冲区(前置预留LWS_PRE字节空间),再根据你要发送的是二进制原始值还是文本字符串选择转换方式:
场景1:发送二进制short原始值
如果你需要传输short的原始字节数据,建议手动拆分高低字节保持和你I2C读取时一致的大端序,避免主机大小端差异导致异常:
// 定义缓冲区,前置预留LWS_PRE字节,后面留short的2字节空间 unsigned char buf[LWS_PRE + sizeof(short)]; short value = read_raw_data(your_register_addr); // 按高字节在前的顺序写入缓冲区有效位置 buf[LWS_PRE] = (value >> 8) & 0xFF; buf[LWS_PRE + 1] = value & 0xFF; // 调用lws_write,协议类型用LWS_WRITE_BINARY int m = lws_write(wsi, buf + LWS_PRE, sizeof(short), LWS_WRITE_BINARY);
场景2:发送文本格式的short值(匹配你示例的LWS_WRITE_TEXT参数)
如果是要传输short的可读字符串形式(比如值为1024就传输"1024"),用snprintf直接转换到缓冲区即可:
// 定义缓冲区,前置预留LWS_PRE字节,后面留32字节文本空间匹配你的示例参数 unsigned char buf[LWS_PRE + 32] = {0}; short value = read_raw_data(your_register_addr); // 将short转为字符串写入缓冲区有效位置 snprintf((char *)(buf + LWS_PRE), 32, "%d", value); // 调用lws_write,长度可以填实际字符串长度,也可以固定填32 int m = lws_write(wsi, buf + LWS_PRE, strlen((char *)(buf + LWS_PRE)), LWS_WRITE_TEXT);
注意事项
- 禁止直接对short变量取指针强转后传入
lws_write:libwebsockets要求传入的缓冲区必须前置预留LWS_PRE字节的空间供内部写入协议头,直接传变量指针会导致内存越界。 - 手动拆分高低字节的方式兼容性更好,不需要考虑当前运行主机的大小端架构,和你I2C读取时的字节序完全一致。
内容的提问来源于stack exchange,提问作者hannes ach
相关产品推荐
相关产品推荐

