【问题标题】:How to hold multiple type data in pointer如何在指针中保存多种类型的数据
【发布时间】:2019-10-27 23:04:51
【问题描述】:

我正在尝试解析一个包含多种数据类型的缓冲区。

以缓冲区为例:

void* buffer = "1111aaaa[another similar buffer][a second similar buffer]1111"
// Buffer is not actually a string, it is just to show (these are bytes that correspond different types).

我有关于如何解析这个文件的信息到目前为止我一直在做memcpy来提取这些值,例如:

memcpy(some_int, buffer, 4);
buffer += 4;
memcpy(some_char_array, buffer, 4);
buffer += 4;
// etc...
// So I am trying to parse the buffer like using a file pointer.

目前这对我有用,但我有一些不正常的行为(可能只是其他一些错误,到目前为止它一直运行良好)。

所以我做了一些研究,认为 c 中的指针算法是不明智的(尽管 GCC 有点允许它)。那么我应该如何在 c 中保存和解析这些数据呢?

这里关于 SO 的一些问题表明,您可以在增加指针(按一定数量的字节)之前将其转换为 char 指针,但这不会给出隐式转换警告并增加代码的复杂性吗?

如果开发人员确切知道他/她想要前进多少字节,是否应该允许增加 void 指针?

如果没有,我如何在其他 C 方法中实现这一点?

Edit1:如果在char* 中保存数据除了帮助我增加指针之外别无其他,我可以从那里保存char*memcpy 中的所有数据吗?

【问题讨论】:

  • @John3136 但是,数据是二进制的,而不是字符串。如果您说它相似,那么我在 Edit1 中的猜测得到了证实,并且我的问题得到了回答。但我不认为我的问题不清楚我在问什么。
  • 标准 C 中不存在 void 指针算法。使用 char * 和 memcpy。例如,使用int32_t 而不是int ...
  • @AnttiHaapala 感谢您的建议,我已经使用int32_t

标签: c gcc void void-pointers


【解决方案1】:

如果您的数据元素的长度已知且始终相同,您可以设置一个结构并将整个缓冲区转换为该结构。

例子:

typedef struct {
    int32_t some_integer;
    char some_char_array[4];
    ... (some_other_member);
} my_data_t;

my_data_t *data = (my_data_t *)buffer;

然后您可以使用data->some_integerdata->some_char_array 等访问您的数据字段,我认为这比在缓冲区中移动指针更清晰、更易于理解。

【讨论】:

    猜你喜欢
    • 2017-08-10
    • 2011-12-09
    • 1970-01-01
    • 2013-09-08
    • 1970-01-01
    • 2018-02-01
    • 2014-02-06
    • 1970-01-01
    • 2021-02-23
    相关资源
    最近更新 更多