处理包含不同长度的二进制数据

Processing binary data containing different length


所以我有一些读取、处理并需要“拆分”成不同变量的二进制数据,如下所示:

int *buffer;
buffer = malloc(size); 
fread(buffer,size,1,file);
buffer = foo(buffer);

在我的调试器中结果看起来像这样:

01326A18 5F4E8E19 5F0A0000

我希望第一个字节 ( 01 ) 是 int a.
下面4个字节是第一个时间戳b(应该是5F186A32
下面4个字节是第二个时间戳c(应该是5F198E4E
0A 应该是 int d.

我的问题是我可以用 (*buffer) & 0xff;,
将 1 放入 a 但我无法正确读取第一个时间戳,因为它是从第二个到第 5 个字节而不是与缓冲区的 int 声明对齐。 如果我打印 *(buffer +1) 它会给我第二个 int 并打印“198E4E5F” 如果我能够从数据中的每个位置定位 n 个字节,那就更好了。

提前致谢。

如果您将缓冲区类型设置为 char*,这将使其指向块的 1 个字节。然后如果尝试获取 buffer+2,它将 return 缓冲区的第二个字节,不像 int 指针 return 缓冲区的第 8 个字节。不要忘记在 malloc 调用中更新您的 size ,因为在这种情况下您的内存是 1 字节块。另外 this link 可能会有帮助。

像这样的东西适用于大多数小端平台。只是害怕同样的方式。

struct {
  uint8_t a;
  uint32_t timeStamp1;
  uint32_t timeStamp2;
  uint8_t d;
} buffer __attribute__((packed));
assert(sizeof buffer == 10);  /* check packing */