【发布时间】:2021-11-13 05:00:21
【问题描述】:
这是一个关于通过缓冲区解析的 C 问题。我有一个缓冲区char buffer[BUFFER_SIZE],看起来像这样:b'\x01\x02\x00\x04\x00\x04aaaabbbb' 基本上我想将它们解析为其他值,例如:
1 > arg1;
2 > arg2;
4 > text1_length;
4 > text2_length;
97,97,97,97 > text1 = "aaaa"
98,98,98,98 > text2 = "bbbb"
我尝试过使用 memcpy 之类的东西,但是在尝试将字节放入 char* 时会变得很棘手:
char buffer[BUFFER_SIZE]; // b'\x01\x02\x00\x04\x00\x04aaaabbbb'
uint8_t arg1 = buffer[0];
uint8_t arg2 = buffer[1];
uint16_t text1_length = (uint16_t) buffer[2];
uint16_t text2_length = (uint16_t) buffer[4];
char* text1 = malloc(text1_length + 1);
char* text2 = malloc(text2_length + 1);
memcpy(text1, &buffer[6], (size_t) text1_length);
memcpy(text2, &buffer[6+text1_length], (size+t) text2_length);
尝试打印出任何长度现在只显示 0,我猜是因为 2 个字节的第一个字节是 0。
【问题讨论】:
-
缓冲区是否包含小端或大端顺序的数据?这对于解析
uint16_t尤为重要。 -
没关系,
text1_length和text2_length中似乎只有一个字节,所以它们实际上是uint8_t类型。 -
@OP 我会根据你上次的编辑更新我的答案。
-
b'\x01\x02\x00\x04\x00\x04aaaabbbb'-> 这是实际的缓冲区。它正在通过网络发送,因此我将其接收到char buffer[BUFFER_SIZE] -
@LucaPolito 有效-它不是最漂亮的,但它有效@AndreasWenzel c 服务器命令
recv(sockfd, receive_buffer, BUFFER_SIZE, 0)用于填充缓冲区,发送它的python 客户端命令是self.sock.sendall(message)其中@ 987654333@