c ++从char数组中的特定索引拉出有符号整数

时间:2017-11-24 20:00:58

标签: c++

我有这行代码,我认为可能不是最好的:

get_entity_id () {
  return ntohl(*(int*)(&data_[ENTITY_ID_INDEX]));
}

data_是char [],ENTITY_ID_INDEX是data_中存储整数的位置。

这编译并且似乎工作正常,但我想知道是否有更好的'这样做的方式。我是否使用C ++ 14,如果重要的话。

1 个答案:

答案 0 :(得分:1)

您没有向我们提供有关data_的更多信息。除非绝对必须,否则应该避免使用二进制数据。更好的方法是使用结构或类。具有原始二进制数据的一般情况是:(1)您的数据是完全定义的,在这种情况下,您可以轻松地将数据映射到结构上,或者(2)它是具有标题和可变长度二进制数据的数据。在第二种情况下,一个技巧是制作一个 struct包含头数据,并且结构的最后一个元素是长度为1的char数组,其中可变长度数据开始。

struct data_type
{
   // real definition
   char a[123];
   ...
   int entity_id;
   ...
   // end of header/fixed elements
   char blob[1]; // beginning of some variable length data.
};

然后

sometype get_entity_id() {
  return ntohl(static_cast< data_type& >(data_).entity_id);
}

*注意:如果对齐是@FrançoisAndrieux所指出的问题(即您打开在机器上编写的二进制文件或具有不同对齐规则的代码),这无济于事。