C++ c++;从字符数组中的特定索引中提取有符号整数

C++ c++;从字符数组中的特定索引中提取有符号整数,c++,C++,我认为这行代码可能不是最好的: get_entity_id () { return ntohl(*(int*)(&data_[ENTITY_ID_INDEX])); } data_uu是char[],ENTITY_ID_INDEX是数据中存储整数的位置 这可以编译,而且似乎工作得很好,但我想知道是否有“更好”的方法。如果有必要的话,我使用的是C++14。关于什么是数据,您没有给我们提供太多信息。在二进制数据中乱翻是需要避免的,除非你必须这样做。更好的方法是使用结构或类。具有原始二进

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

get_entity_id () {
  return ntohl(*(int*)(&data_[ENTITY_ID_INDEX]));
}
data_uu是char[],ENTITY_ID_INDEX是数据中存储整数的位置


这可以编译,而且似乎工作得很好,但我想知道是否有“更好”的方法。如果有必要的话,我使用的是C++14。

关于什么是
数据,您没有给我们提供太多信息。在二进制数据中乱翻是需要避免的,除非你必须这样做。更好的方法是使用结构或类。具有原始二进制数据的一般情况是:(1)您的数据已完全定义,在这种情况下,您可以轻松地将数据映射到结构上;(2)它是具有标头和可变长度二进制数据的数据。在第二种情况下,一个诀窍是制造
结构,并使结构的最后一个元素具有长度为1的字符数组,可变长度数据从该数组开始

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获取实体id(){
返回ntohl(静态类型转换<数据类型&>(数据类型)。实体id);
}

*注意:如果对齐是@François Andrieux指出的一个问题(即您正在打开在机器上编写的二进制文件或使用不同对齐规则的代码),则这没有帮助

你应该知道。我不确定这个表达式是否是定义良好的行为,因为它似乎违反了。更安全的方法是通过.Oof将数据复制到
int
中,我不知道如何对齐。我必须研究特定大小的char[]是如何对齐的,并从那里开始工作。看起来我可以在char[]定义中使用alignas(int),然后我将坚持使用边界。令人惊叹的我将研究使用memcpy而不是重铸和取消引用。如果使用
std::memcpy
将字节复制到
int
对象,则无需对齐数据。它将被写入一个
int
,根据自身的需求隐式对齐。谢谢。数据是从网络读取的二进制数据,从不同机器上组装的数据包读取(使用C#,这并不重要)。数据在到达这里时已完全定义。此数据是一种特定类型的消息,从包含多条消息的数据包中提取。你可能是对的,结构是最好的,我会研究一下。现在每个消息类都有一个process()函数,用于对数据进行操作。。。如果我把消息转换成一个结构,那还可能吗?也许是类内部的结构?有机会的话我会试试的。我展示的是一个吊舱结构;这种类型的二进制布局可以映射到任意二进制数据。如果结构正确,data_uu指向的二进制数据与data_uu指针强制转换的结构类型的对象之间没有区别。请注意,如果消息为“header+可变长度消息类型”,则无法直接使用struct安全地复制它,则必须使用原始指针进行复制。使用struct复制固定长度的消息是可以的。我最终在消息类中使用了struct,并在每个类中使用了const length变量(由虚拟get_length返回)。我还定义了一个虚拟拷贝数据,它接受一个char指针并将结构数据写入该位置。对struct而不是raw char[]的更改使得定义、访问和复制数据变得更加容易。非常感谢。
sometype get_entity_id() {
  return ntohl(static_cast< data_type& >(data_).entity_id);
}