Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/142.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/71.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 从字符数组转换/提取整数_C++_C_Bit Manipulation_Zlib_C Strings - Fatal编程技术网

C++ 从字符数组转换/提取整数

C++ 从字符数组转换/提取整数,c++,c,bit-manipulation,zlib,c-strings,C++,C,Bit Manipulation,Zlib,C Strings,我收到了一个cstring,来自gzread的一个电话。我知道数据是块,每个块由无符号int、char、int和无符号short int组成 //Some pseudocode below which would work char buf[11]; unsigned int a; char b; int c; unsigned short int d; 所以我想知道将这个cstring分解成适当变量的标准方法是什么 假设前4个字节是无符号整数,下一个字节是字符,下4个字节是有符号整数,最后2

我收到了一个cstring,来自gzread的一个电话。我知道数据是块,每个块由无符号int、char、int和无符号short int组成

//Some pseudocode below which would work
char buf[11];
unsigned int a;
char b;
int c;
unsigned short int d;
所以我想知道将这个cstring分解成适当变量的标准方法是什么

假设前4个字节是无符号整数,下一个字节是字符,下4个字节是有符号整数,最后2个字节是无符号短整数

//Some pseudocode below which would work
char buf[11];
unsigned int a;
char b;
int c;
unsigned short int d;
我想我可以用适当的偏移量来记忆

memcpy(&a, buf, sizeof(unsigned int));
memcpy(&b, buf+4, sizeof(char));
memcpy(&c, buf+5, sizeof(int));
memcpy(&d, buf+9, sizeof(unsigned short int));
还是使用一些位运算符更好?比如移动和掩蔽

或者将所有11个字节直接读入某个结构会更好,或者这是可能的?结构的内存布局是固定的吗?gzread是否可以使用此功能?

如果您打包结构(在
\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu。因此,您可以直接读入结构。然而,我不确定这个解决方案的可移植性

否则,请使用指针魔法和施法,如下所示:

char *buffer;
int a = *(reinterpret_cast<int*> (buffer))
unsigned short b = *(reinterpret_cast<unsigned short*> (buffer + sizeof(int)))
char*缓冲区;
int a=*(重新解释强制转换(缓冲区))
无符号短b=*(重新解释强制转换(缓冲区+sizeof(int)))

您需要确保文件的字节顺序与正在运行代码的处理器体系结构相匹配。例如,如果整数以最高有效字节的顺序写入文件,而处理器以最低有效字节的顺序写入文件,那么结果就是垃圾


如果要使代码从一种体系结构移植到另一种体系结构,则应将整数的所有读写操作包装在宏或内联函数后面,这些宏或内联函数根据目标处理器体系结构管理字节顺序。

这取决于输入数据的定义方式。如果它被定义为主机端序(即端序始终与代码运行的系统相匹配),那么您展示的
memcpy()
是一种很好的可移植方法


或者,如果输入数据被定义为具有特定的尾数,那么最好的可移植解决方案是使用移位和按位or每次加载一个
无符号字符。

您需要一个格式规范才能执行任何操作。是 它是文本或二进制(可能是您描述的二进制,但只有一个) 不知道)?符号值的表示形式是什么?什么 字节顺序是什么
memcpy
仅在您的机器架构 与输入格式完全一致——这是当今罕见的情况, 因为几乎所有的网络格式都是big-endian格式,并且最为广泛 架构是小端的。(目前大多数格式和体系结构 对负值使用2的补码,因此您可以经常“假定” 兼容性。但也有例外。)

鉴于此,数值的数学重建(使用掩蔽和 移位(或乘法)是唯一可移植的解决方案。依靠 在机器和编译器的质量上,它很容易得到结果
性能也更好。

+1对于本例,尽管大多数现代硬件都是little endian,可能除了大型机和专用处理器之外。在具有严格对齐要求的系统上,如果缓冲区没有正确对齐以作为较长类型进行访问,那么使用类似这样的指针的类型双关将失败。-1,因为它完全是错误的。大多数处理器都有对齐要求,这会导致代码崩溃,当然,处理器在endian方面差异很大,在少数情况下,甚至它们如何表示有符号整数。@ame大多数现代处理器都是big endian;我所知道的唯一例外是英特尔体系结构(以及Alpha,如果它仍然存在的话)。“标准”互联网格式也是大端的。当然,如果你不得不考虑大型机,有些甚至不是2的补充。@James Kanze:当然,这不是设计可移植二进制格式的一种方法,但序列化意味着它是可以的。如果数据在同一台机器上被序列化和反序列化,那么endianness和alignments将是相同的。您如何确切地了解输入文件的endianness?我一直想知道是否有一种方法可以做到这一点,而不需要除了文件本身之外的任何数据。如果没有,你就靠自己了。不过,在这种情况下,一些启发式方法可能会有所帮助:你可以假设像1这样的较小数字比1073741824(1b反转的32位表示)更常见。@arne嗯,它必须是文件中编码的东西。对于文本文件,有一个可选的BOM表可以告诉您文件的字节顺序,但这完全取决于文件的创建者:(@arne:您可以要求文件的第一到第二个字节组成一个特定的整数值。然后您读取它们,看看值是否正确。如果不正确,您必须交换字节。