我必须从一个文件中读取10个字节,最后4个字节是一个无符号整数。但是我得到了一个11个字节长的字符数组/指针。如何将最后4个字节(末尾没有零终止字符)转换为无符号整数?4个字符为int在c + +
//pesudo code
char *p = readBytesFromFile();
unsigned int myInt = 0;
for(int i = 6; i < 10; i++)
myInt += (int)p[i];
这是正确的吗?对我来说似乎不正确。
我必须从一个文件中读取10个字节,最后4个字节是一个无符号整数。但是我得到了一个11个字节长的字符数组/指针。如何将最后4个字节(末尾没有零终止字符)转换为无符号整数?4个字符为int在c + +
//pesudo code
char *p = readBytesFromFile();
unsigned int myInt = 0;
for(int i = 6; i < 10; i++)
myInt += (int)p[i];
这是正确的吗?对我来说似乎不正确。
下面的代码威力工作:
myInt = *(reinterpret_cast<unsigned int*>(p + 6));
IFF:
sizeof(int) == 4
,这是不保证到处如果不一样,因为Dietmar建议,你应该环比数据(正向或反向根据字节顺序),并完成类似
myInt = myInt << 8 | static_cast<unsigned char>(p[i])
这是定位安全(这应该是每一个系统上)。仍然注意点1和3.
严格的别名。你不能通过unsigned int类型的glvalue来访问一堆字符的存储值。 – 2014-10-06 05:38:04
不要这样做的另一个原因。 – 2014-10-06 05:39:11
尝试myInt = *(reinterpret_cast<unsigned int*>(p + 6));
。
这需要第6个字符的地址,重新解释为指向unsigned int的指针,然后返回它指向的(unsigned int)值。
这对于字节顺序可能会很危险 – 2014-10-04 20:13:26
为什么要将它指向一个指针? – Davlog 2014-10-04 21:06:25
因为没有'unsigned int'变量来查看。我们正在研究需要指针的任意内存。 'reinterpret_cast'只能用于指针。 – 2014-10-05 13:03:38
我同意以前的答案,但只是想补充说明,如果该文件是用不同的字节顺序创建的,则此解决方案可能无法100%工作。
我不想混淆你额外的信息,但请记住,当你从文件直接转换时,字节顺序可能会导致你的问题。
这里有一个关于字节序的教程:http://www.codeproject.com/Articles/4804/Basic-concepts-on-Endianness
尝试'*(int *)(p + 6)'。 – Athari 2014-10-04 19:25:35
使用'memcpy'。 *(int *)(p + 6)'(1)可能会遇到对齐问题,并且(2)违反严格的别名。字节顺序也是一个问题。 – 2014-10-04 19:30:17
你需要将不同字节的位移到合适的位置。取决于转移价值的永恒性。循环中的赋值可能是'myInt = myInt << 8 | static_cast(p [i])'。或者,您可能想要反向循环循环。 –
2014-10-04 19:30:30