Чтение 6-байтового 8-битного целого числа из двоичного файла - PullRequest
2 голосов
/ 30 августа 2011

Вот как выглядит мой файл:

00 00 00 00 00 34 ....

Я уже прочитал его в массив unsigned char, используя fread, но я не знаю, как теперь я могу превратить его в unsigned integer. Массив выглядит так:

0, 0, 0, 0, 0, 52

Ответы [ 5 ]

3 голосов
/ 30 августа 2011

Вот как я заставил его работать:

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];
2 голосов
/ 30 августа 2011

Вы начинаете с 48-битного значения, но, вероятно, в вашей системе нет 48-битного целочисленного типа. Хотя, вероятно, существует 64-битный тип, и это может быть "long long".

Предполагая, что ваши 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

0 голосов
/ 30 августа 2011

Это то, о чем вы говорите?

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

0 голосов
/ 30 августа 2011

, если вы хотите интерпретировать 4 байта массива uchar как один 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];
0 голосов
/ 30 августа 2011

Если файл заполнен 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);
}

Этот алгоритм предполагает, что числа уже всеправильно закодированы в файл.Это также предполагает порядковый номер, который я не могу назвать по макушке.

...