wx Hex Editor

Dieser Hex-Editor zeichnet sich über mächtige Speicheroptionen aus:

  • Die Hexwerte können mit Speicheroffset gespeichert werden
  • Hexwerte können mit ASCII-Interpretation gespeichert werden
  • Hexwerte können als C-Array mit einer wählbaren Datengrösse (int8_t, int16_t, int32_t, ..) gespeichert werden

Dies erleichtert die Weiterverarbeitung der eingelesenen Daten.


Debuggen von Speicher

Der Inhalt des Speichers (z.B.) eines Arrays muss in ein File kopiert werden. Das File wird eingelesen.

wxHexEditor

Im Menu können unter VIEW unterschiedliche Fenster (Pannel genannt) aktiviert werden.

Linke Fenster
Zeigt die selektierten Daten in unterschiedlichen Formaten an (Pannel Dateninterpreter) und in der Mitte das Infopannel.

Hauptfenster oben

Mehrere Files  können parallel angezeigt werden.

Hauptfenster unten

Ist die Ascii Interpretation des Inhalts. Das Pannel wird TextControl genannt.

ASCII-File to Binary-File

edid.txt
Eine Binärdatei, die in hex eingelesen wurde:

00 FF FF FF FF FF FF 00 4D D9 01 08 01 01 01 01 
01 11 01 03 80 A0 5A 78 0A 0D C9 A0 57 47 98 27 
12 48 4C 21 08 00 01 01 01 01 01 01 01 01 01 01

Konvertieren zu edid.bin

cat edid.txt | xxd -r -p > edid.bin

xxd ist ein Programm. Das andere ist hexdump

binary output C++

Problem mit << (Standard filestream Operator)

Mit Bitset und << in einen Outputfilestream wurde jedes 0 und jedes 1 zu einem Ascii gewandelt.

std::bitset<16> left (161);
std::bitset<8> symbol(98);

std::ofstream ofs;
ofs.open("treebinary.bin", std::ofstream::binary) 

ofs << left << symbol ;

ofs.close()

Dateigrösse (16 + 8) * 1 Char = 24 Byte. (Faktor 8 zu gross).

Lösung write( Pointer to Data, size)
In der Funktion write kann ein Pointer übergeben werden. Dadurch findet keine Umwandlung in String (durch <<) statt. Die 0 und 1er werden direkt binär geschrieben.

char data[3]    // 3 Bytes

// inhalt von 1 Byte und 2 Bytes
std::bitset<16> left (361);
std::bitset<8> symbol(98);

// array füllen
data[0] = left;
data[2] = symbol;

//array in 1mal ausgeben
std::ofstream ofs; ofs.write((char *) data , 3) 

ofs.close()
  • Alle Bits werden auf einmal geschrieben
  • kein << left << symbol notwendig
  • Man gibt den Pointer mit und die Länge der Daten
char* data[3]    // initalisiert als Pointer

std::bitset<16> left (361);
std::bitset<8> symbol(98);

data[0] = left;
data[2] = symbol;

std::ofstream ofs; ofs.write(data , sizeof() 

ofs.close()
// array of struct
std::struct Node
{  
    uint16_t left = 0;
    uint16_t right = 0;
    uint8_t symbol = 0;
    bool filled = false;
};

Node tree[100];

// füllen des arrays per tree-funktion


// array per Pointer mitgeben, länge = Node-länge * Anzahl
std::ofstream ofs; ofs.write((char*) tree , sizeof( (struct Node) * 100);

ofs.close()

Bytes einlesen

Byte-Struktur
– Formatvariablen definieren definieren Datenstruktur
– Formatvariablen stehen in einem String
– für jede Formatvariable muss eine Variable mitgegeben werden
– folgen grosse Datenpakete als, muss deren Länge
.  bekannt sein und wird vor der Stringvariable eingefügt
– “ > “ bedeutet big endian,  “ < “ littel endian

command = pack(‚ >BH‘ + str(length) + ’s ‚, typ, command, length, data)

Python_Struct_BefehlsTabelle

Vor Daten Schlüsselwörter einfügen
data = pack(‚ >BBH’+str(length)+’s ‚, testnumber, time, command, length, data)

Schlüsselwörter vor Data extrahieren
testnumber = unpack(‚>B‘, data[0:1])
time = unpack(‚>B‘, data[1:2])

Daten ohne Schlüsselwörter
data[:4]                             die ersten 4 Bytes werden weggelassen

Big Endian / Littel Endian
big endian = normal      a = (‚>B‘, 3)            output           a = 00 03
little endian                      a = (‚<B‘, 3)            output           a = 03 00

Info
In Python werden Daten als String übergeben. Sollen diese eine bestimmte Byte-Struktur haben, helfen die Funktionen pack() and unpack().
import struct *

binär, hex, ascii

Info
In Python wird vieles per string weitergegeben. Um die Stringwerte zu verstehen,  hier ein kleiner Überblick:
–  „0x3“ entsprechen 3 Bytes (Ascii)
–  „\x3“ enrspricht einem Byte (Binärdatei)
– „\A3“ entspricht einem Byte (Binärdatei)

Binär einlesen
f = open( „../../edid.bin“ , „rb“ )
edid = f.read()                              ‚\xA1 \x10 \xFF 0\x32‘ == 4 Bytes

Wichtige Funktionen
Achtung !!                                
Wandeln Binärzahlen in ASCII !!
bin_zahl = bin(4)                       ‚0b100‘ == 5 Bytes
hex_zahl = hex(12)                  ‚0xc“ == 3 Bytes (Ascii)
edid = hex(3) + edid                „0x3 \xA1 \x10 “ == 3 + 2 = 5 Bytes