从char []字节获取int

时间:2012-02-06 18:39:49

标签: c pointers

我有一个文件,我读入了一个char数组。

char数组现在拥有一定数量的字节,现在如果我知道文件存储了一个32位整数的小端,位于0x8位置,我如何从char数组中检索它?

FILE * file = fopen("file");
char buffer[size];
fread(buffer,1,size,file);
int = buffer[0x8]; // What should I do here?
// I imagine it involves some strange pointer
// arithmetic but I can't see what I should do,
// casting to int just takes the first byte,
// casting to (int *) doesn't compile

4 个答案:

答案 0 :(得分:3)

你需要像这样投射:

int foo = *((int *) &buffer[0x8]);

首先将该点转换为int指针并将其取消引用到int本身。

[注意不同机器类型的字节顺序;有些做高字节,有些做低[] p

为了确保该示例得到充分理解,以下是一些显示结果的代码:

#include <stdio.h>

main() {
    char buffer[14] = { 0,1,2,3,4,5,6,7,8,9,10,11,12,13 };
    int foo = *((int *) &buffer[0x8]);
    int bar = (int) buffer[0x8];

    printf("raw: %d\n", buffer[8]);
    printf("foo: %d\n", foo);
    printf("bar: %d\n", bar);
}

运行它的结果:

raw: 8
foo: 185207048
bar: 8

答案 1 :(得分:3)

“简单”方法,假设数组包含与您的机器具有相同字节序的字节,并且没有任何特殊的对齐要求,则为:

int x = *(int *)&buffer[8];

如果你确实有字节序差异,你需要处理它。如果存在对齐问题(甚至可能存在对齐问题),则应逐个提取字节:

int x = buffer[8] + (buffer[9] << 8) + (buffer[10] <<  16) + (buffer[11] << 24);

如果字节顺序是另一种方式,则可能是另一个方向。

答案 2 :(得分:1)

通过更改该值的两个字(16位)来完成4字节值的字节转换,因此效率较低但可读的方式(如果数据是大端编码的话):

int val = 0x00000000;
char* ptr = reinterpret_cast<char*>(&val);
*ptr = buffer[0x0a];
ptr++;
*ptr = buffer[0x0b];
ptr++;
*ptr = buffer[0x08];
ptr++;
*ptr = buffer[0x09];
ptr++;

但是还有很多其他方法可以像结构,memcpy那样做...取决于你的目标是什么(性能,可读性......)

祝你好运, 亚历

答案 3 :(得分:0)

int *list = (int*)buffer;
int n = fread(buffer, 1, size, file);
for (int i=0; i< n/sizeof(int); i++)
  printf("%d\n", list[i]);
相关问题