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

Reading 6 byte 8-bit integer from binary file

本文关键字:8位 整数 6字节 读取 二进制文件      更新时间:2023-10-16

我的文件是这样的:

00 00 00 00 00 34 ....

我已经使用fread将其读取到unsigned char数组,但我不知道,我现在如何将其变成unsigned integer。数组看起来像这样:

0, 0, 0, 0, 0, 52

我是这样让它工作的:

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];

您从48位值开始,但是您的系统上可能没有48位整数类型。可能有64位类型,可能是"long - long"。

假设您的6个字节是按最重要的顺序排列的,并且了解您需要为long long填充两个额外的字节,您可以这样做:

long long myNumber;
char *ptr = (char *)&myNumber;
*ptr++ = 0; // pad the msb
*ptr++ = 0; // pad the 2nd msb
fread(ptr, 1, 6, fp);

现在你得到了myNumber

如果文件由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);
}

这个算法假设所有的数字都已经在文件中被正确编码。它还假定了一种我无法立即命名的顺序。

如果您想将uchar数组的4个字节解释为一个int,请执行以下操作:

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

如果你想将你的uchar数组中的一个字节转换为一个int,执行以下命令:

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

这就是你说的吗?

// 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