处理包含不同长度的二进制数据
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 */
所以我有一些读取、处理并需要“拆分”成不同变量的二进制数据,如下所示:
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 */