Wie entferne ich das Auffüllen von Bytes zwischen Datenelementen einer Struktur

Ich habe eine Binärdatei mit "messages" und versuche, die Bytes mithilfe von structs in die richtige Variable einzufügen. In meinem Beispiel habe ich zwei Arten von Nachrichten verwendet: Tmessage und Amessage.

#include <iostream>
#include <fstream>
#include <stdlib.h>
#include <string>
#include <iomanip>

using namespace std;

struct Tmessage
{
    unsigned short int Length;
    char MessageType;
    unsigned int Second;
};

struct Amessage
{
    unsigned short int Length;
    char MessageType;
    unsigned int Timestamp;
    unsigned long long int OrderReferenceNumber;
    char BuySellIndicator;
    unsigned int Shares;
    char Stock[6];
    unsigned int Price;
};

int main(int argc, char* argv[])
{
    const char* filename = argv[1];
    fstream file(filename, ios::in | ios::binary);
    unsigned long long int pi = 0;

    if(file.is_open()){ cout << filename << " OPENED" << endl; }
    else { cout << "FILE NOT OPENED" << endl; }

    unsigned char* memblock;
    memblock = new unsigned char[128];
    file.read((char *)memblock, 128);

    cout <<  "BINARY DATA" << endl;
    while (pi < 128)
    {
        cout << setw(2) << hex << static_cast<unsigned int>(memblock[pi]) << " ";
        pi++;
        if((pi%16)==0) cout << endl;
    }

    unsigned int poi = 0;

    Tmessage *Trecord;
    Trecord = (Tmessage *)memblock;
    cout << "Length: " << hex << (*Trecord).Length << endl;
    cout << "Message type: " << hex << (*Trecord).MessageType << endl;
    cout << "Second: " << hex << (*Trecord).Second << endl;

    poi = poi + 7; cout << endl;

    Amessage *Arecord;
    Arecord = (Amessage *)(memblock+poi);
    cout << "Length: " << hex << (*Arecord).Length << endl;
    cout << "Message type: " << hex << (*Arecord).MessageType << endl;
    cout << "Timestamp: " << hex << (*Arecord).Timestamp << endl;
    cout << "OrderReferenceNumber: " << hex << (*Arecord).OrderReferenceNumber << endl;
    cout << "BuySellIndicator: " << hex << (*Arecord).BuySellIndicator << endl;
    cout << "Shares: " << hex << (*Arecord).Shares << endl;
    cout << "Stock: " << hex << (*Arecord).Stock << endl;
    cout << "Price: " << hex << (*Arecord).Price << endl;

    delete memblock;
    file.close();
    cout << endl << "THE END" << endl;
    return 0;
}

Die Ausgabe, wenn ich das Programm starte:

stream OPENED
BINARY DATA
 0  5 54  0  0 62 72  0 1c 41  0  f 42 40  0  0 
 0  0  0  4 2f 76 53  0  0  3 e8 53 50 59 20 20 
20  0 11  5 d0  0 1c 41  0  f 42 40  0  0  0  0 
 0  4 2f 78 42  0  0  3 e8 53 50 59 20 20 20  0 
10 f7 5c  0 1c 41  0  f 42 40  0  0  0  0  0  4 
2f 90 53  0  0  1 2c 53 50 59 20 20 20  0 11  2 
b0  0  5 54  0  0 62 76  0  d 44 14 25 78 80  0 
 0  0  0  0  4 2f 90  0  d 44 14 25 78 80  0  0 
Length: 500
Message type: T
Second: 726200

Length: 1c00
Message type: A
Timestamp: 40420f
OrderReferenceNumber: 53762f0400000000
BuySellIndicator: 
Shares: 20595053
Stock:   
Price: 420f0041

THE END

Das Programm fügt die Bytes korrekt in die Tmessage-Struktur ein. (0 5 54 0 0 62 72)
Es tritt jedoch etwas auf, während Amessage analysiert wird.
(0 1c 41 0 f 42 40 0 0 0 0 0 4 2f 76 53 0 0 3 e8 53 50 59 20 20 0 11 5 d0)

Länge, Nachrichtentyp und Zeitstempel sind korrekt, aber OrderReferenceNumber enthält das Byte "53", das zu BuySellIndicator gehört, und die andere Variable ist falsch.

Die korrekte A-Nachrichtenausgabe sollte lauten:
Länge: 1c 0
Nachrichtentyp: 41
Timestamp: 40 42 f 0
OrderReferenceNumber: 76 2f 4 0 0 0 0 0
BuySellIndicator: 53
Shares: e8 3 0 0
Stock: 53 50 59 20 20 20
Preis: d0 5 11 0

Die 2 Fragen: a) Warum enthält die OrderReferenceNumber das Byte "53"? b) Ich denke, dass "char Stock [6]" nicht funktioniert, da zwischen den Bytes von Share und Price mehr als 6 Bytes liegen. Wie kann ich die 6 Bytes in den Zeichenvektor oder die Zeichenfolge einpassen?

Hinweis: Mir ist bewusst, dass ich die Bytes tauschen muss, da die Binärdaten in Big-Endian vorliegen. Deshalb sollte "Stock" nicht getauscht werden. Vielen Dank für Ihre Hilfe! Mit freundlichen Grüßen

Antworten auf die Frage(4)

Ihre Antwort auf die Frage