2014-10-04 56 views
1

我必须从一个文件中读取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]; 

这是正确的吗?对我来说似乎不正确。

+1

尝试'*(int *)(p + 6)'。 – Athari 2014-10-04 19:25:35

+1

使用'memcpy'。 *(int *)(p + 6)'(1)可能会遇到对齐问题,并且(2)违反严格的别名。字节顺序也是一个问题。 – 2014-10-04 19:30:17

+3

你需要将不同字节的位移到合适的位置。取决于转移价值的永恒性。循环中的赋值可能是'myInt = myInt << 8 | static_cast (p [i])'。或者,您可能想要反向循环循环。 – 2014-10-04 19:30:30

回答

2

下面的代码威力工作:

myInt = *(reinterpret_cast<unsigned int*>(p + 6)); 

IFF:

  • 没有对齐的问题(例如,在GPU的内存空间如果没有提供某些担保,这很可能会打击)。
  • 可以保证系统字节序是用于存储数据
  • 你可以肯定的是sizeof(int) == 4,这是保证到处

如果不一样,因为Dietmar建议,你应该环比数据(正向或反向根据字节顺序),并完成类似

myInt = myInt << 8 | static_cast<unsigned char>(p[i]) 

这是定位安全(这应该是每一个系统上)。仍然注意点1和3.

+0

严格的别名。你不能通过unsigned int类型的glvalue来访问一堆字符的存储值。 – 2014-10-06 05:38:04

+0

不要这样做的另一个原因。 – 2014-10-06 05:39:11

1

尝试myInt = *(reinterpret_cast<unsigned int*>(p + 6));

这需要第6个字符的地址,重新解释为指向unsigned int的指针,然后返回它指向的(unsigned int)值。

+0

这对于字节顺序可能会很危险 – 2014-10-04 20:13:26

+0

为什么要将它指向一个指针? – Davlog 2014-10-04 21:06:25

+0

因为没有'unsigned int'变量来查看。我们正在研究需要指针的任意内存。 'reinterpret_cast'只能用于指针。 – 2014-10-05 13:03:38

2

我同意以前的答案,但只是想补充说明,如果该文件是用不同的字节顺序创建的,则此解决方案可能无法100%工作。

我不想混淆你额外的信息,但请记住,当你从文件直接转换时,字节顺序可能会导致你的问题。

这里有一个关于字节序的教程:http://www.codeproject.com/Articles/4804/Basic-concepts-on-Endianness