【问题标题】:Parsing a buffer in C在 C 中解析缓冲区
【发布时间】: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_lengthtext2_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@

标签: c parsing buffer


【解决方案1】:

试试这个:

uint8_t buffer[BUFFER_SIZE];

uint8_t arg1 = buffer[0];
uint8_t arg2 = buffer[1];
uint16_t text1_length = ((uint16_t) buffer[2] << 8) + (uint16_t) buffer[3];
uint16_t text2_length = ((uint16_t) buffer[4] << 8) + (uint16_t) buffer[5];

char* text1 = malloc(text1_length + 1); // TODO: check for NULL
char* text2 = malloc(text2_length + 1); // TODO: check for NULL

memcpy(text1, &buffer[6], (size_t) text1_length);
text1[text1_length] = '\0';

memcpy(text2, &buffer[6 + text1_length], (size_t) text2_length);
text2[text2_length] = '\0';

// TODO: free() both text1 and text2

编辑:已根据您上次的编辑更新代码。

【讨论】:

  • 缓冲区包含大端顺序的数据(它是使用 python 客户端 struct.pack('&gt;BBHH', arg1, arg2, text1_length, text2_length) + (text1 + text2).encode() 打包的。我将编辑原始问题以更准确地反映我正在尝试做的事情。当我尝试了上面的方法,它导致 text1 和 text2 的长度为 0,因此错过了为 text1 和 text2 设置内存后所做的任何事情
  • @TF 哦,所以缓冲区确实包含uint16_t类型的整数,不是吗?更新问题,我会更新我的答案。
猜你喜欢
  • 1970-01-01
  • 2017-10-08
  • 1970-01-01
  • 2018-11-21
  • 2019-07-12
  • 2020-09-11
  • 1970-01-01
  • 1970-01-01
  • 2018-04-09
相关资源
最近更新 更多