Нарезка текста с помощью структуры

#c

Вопрос:

Файл s_file содержит следующий номер: 131071.Это равно 0b00000001111111111111111111111111.

Цель состоит в том, чтобы установить первые 8 бит в переменные данные->идентификатор, а остальные (16 бит) в переменные данные->>x_data. Но когда я печатаю идентификатор и x_data, результат следующий:

идентификатор данных: 1

данные x_data: 12337

Некоторая помощь была бы признательна.

 #include <fstream>
#include <iostream>
#include <typeinfo>

using namespace std;

typedef struct st_payload_t{
  uint8_t id;
  uint16_t x_data;
}sf_payload_t;

int main() {

    ifstream file;

    file.open("s_file", ios::binary|ios::in);
    if( file.is_open()){
      uint8_t payload[200]={0,};
      file.seekg( 0, file.beg); // Possition 0 at the relative beginning of the file
      file >> payload;
      sf_payload_t* data_1 = (sf_payload_t*) amp;payload[0];

      std::cout << "data id: "<<data_1->id<< std::endl;// 00000001 bin - > 1 dec
      std::cout << "data x_data: "<<data_1->x_data<< std::endl;// Should be 1111111111111111 bin - > 65535 dec

    }
    else{
      std::cout << "Not reading" << 'n';
    }

    return 0;
}
 

Комментарии:

1. 1048575 кажется, он слишком велик для 16 бит ( uint16_t ).

2. operator >> предназначен для использования с отформатированными данными, а не с необработанными двоичными файлами. Есть ли какая-то причина, по которой вам нужно заполнить буфер, а затем выполнить приведение указателя? Я думаю, что я бы просто создал sf_payload_t объект, а затем использовал file.read его для каждой переменной-члена.