从二进制文件中读取6字节的8位整数

时间:2011-08-29 22:24:41

标签: c++ binary-data

这就是我的文件:

00 00 00 00 00 34 ....

我已经使用unsigned char将其读取到fread数组,但我不知道,我现在如何将其转换为unsigned integer。 该数组如下所示:

0, 0, 0, 0, 0, 52

5 个答案:

答案 0 :(得分:3)

这就是我开始工作的方式:

unsigned char table_index[6];
fread(table_index, 1, 6, file);

unsigned long long tindex = 0;
tindex = (tindex << 8);
tindex = (tindex << 8);
tindex = (tindex << 8) + table_index[0];
tindex = (tindex << 8) + table_index[1];
tindex = (tindex << 8) + table_index[2];
tindex = (tindex << 8) + table_index[3];
tindex = (tindex << 8) + table_index[4];
tindex = (tindex << 8) + table_index[5];

答案 1 :(得分:2)

您从48位值开始,但系统上可能没有48位整数类型。可能有一个64位类型,它可能是一个“很长”。

假设您的6个字节首先排序最重要,并且了解您需要长时间填写两个额外字节,您可能会执行以下操作:

long long myNumber;
char *ptr = (char *)&myNumber;
*ptr++ = 0; // pad the msb
*ptr++ = 0; // pad the 2nd msb

fread(ptr, 1, 6, fp);

现在你在myNumber

中得到了一个值

答案 2 :(得分:0)

如果文件中填充了48位整数,就像我假设你所说的那样,从char数组中,你可以这样做:

char temp[8];
unsigned char *data = //...
unsigned char *data_ptr = data;
vector<unsigned long long> numbers;

size_t sz = // Num of 48-bit numbers
for (size_t i = 0; i < sz; i++, data_ptr += 6)
{
   memcpy(temp + 2, data_ptr, 6);

   numbers.push_back((unsigned long long)*temp);
}

此算法假定数字已在文件中正确编码。它还假定了一个我无法用头脑命名的字节序。

答案 3 :(得分:0)

如果你想解释你的uchar数组的4个字节,就像一个uint那样:

unsigned char uchararray[totalsize];
unsigned int * uintarray = (unsigned int *)uchararray;

如果您希望将uchar数组的一个字节转换为一个uint,请执行以下操作:

unsigned char uchararray[totalsize];
unsigned int uintarray[totalsize];

for(int i = 0 ; i < totalsize; i++)
    uintarray[i] = (unsigned int)uchararray[i];

答案 4 :(得分:0)

这就是你在谈论的吗?

// long long because it's usually 8 bytes (and there's not usually a 6 byte int type)
vector<unsigned long long> numbers;
fstream infile("testfile.txt");

if (!infile) {
    cout << "fail" << endl;
    cin.get();
    return 0;
}

while (true) {
    stringstream numstr;
    string tmp;
    unsigned long long num;

    for (int i = 0; i < 6 && infile >> tmp; ++i)
        numstr << hex << tmp;

    if (cin.bad())
        break;

    cout << numstr.str() << endl;
    numstr >> num;
    numbers.push_back(num);
}

我使用您提供的输入(00 00 23 51 A4 D2)对其进行了测试,并且该向量的内容为592553170