Endianness (Bytereihenfolge) und Fingerprints

Für allgemeine Fragen zur Programmierung mit PureBasic.
Benutzeravatar
STARGÅTE
Kommando SG1
Beiträge: 7039
Registriert: 01.11.2005 13:34
Wohnort: Glienicke
Kontaktdaten:

Endianness (Bytereihenfolge) und Fingerprints

Beitrag von STARGÅTE »

Tachchen,

habe mal eine etwas andere Frage zur Bytereihenfolge (Big- und Little-Endian) in bezug auf Fingerprints wie CRC32, MD5 usw.:
Gibt es dort eine Norm, wie man solche Fingerprints, also 32Bit, 128Bit oder größer abspeichert.
Es habe es nun schon öfter erlebt, das ein CRC32-Fingerprint als Long in Big-Endian gespeichert wird, was beim Prüfen natürlich zu einem Fehler führt, wenn man es nicht weiß und die Zahl als Little-Endian ließt.
Der MD5 wird zwar meistens als HEX-String angegeben, ist aber auch nur eine Aneinanderreihung von 16 Byte, gibt es da eine Norm, wie dieser gespeichert wird?

Hintergrund dieser Frage ist: Ob ich, wenn der Benutzer eines Programms Bytereihenfolge auf Big-Endian setzt, wirklich alles "umdrehen" muss/soll, also eben auch MD5-Fingerprints, oder nur Fingerprints die als Long/Quad darstellbar sind, oder nie Fingerprints?

Ich hoffe ihr könnt mir einen Rat geben.
PB 6.01 ― Win 10, 21H2 ― Ryzen 9 3900X, 32 GB ― NVIDIA GeForce RTX 3080 ― Vivaldi 6.0 ― www.unionbytes.de
Aktuelles Projekt: Lizard - Skriptsprache für symbolische Berechnungen und mehr
Mr.L
Beiträge: 51
Registriert: 05.02.2011 21:04

Re: Endianness (Bytereihenfolge) und Fingerprints

Beitrag von Mr.L »

Wäre es möglich den Fingerprint "Byte für Byte" in ein Array zu speichern und zu lesen? Dann sollte es doch eigentlich keine Komptibilitätsprobleme
geben, oder irre ich mich?
Benutzeravatar
STARGÅTE
Kommando SG1
Beiträge: 7039
Registriert: 01.11.2005 13:34
Wohnort: Glienicke
Kontaktdaten:

Re: Endianness (Bytereihenfolge) und Fingerprints

Beitrag von STARGÅTE »

Aber genau das ist doch das Problem, welche Reihenfolge wird bei Byte für Byte verwendet?

Nehmen wir an, eine Fingerprint-Funktion gibt einen 16Bit-Schlüssel zurück: 00100111'00010000
Nun gibt es die möglichkeit diesen Schlüssel in genau dieser Form zu speichern:
Erst 00100111 und dann 00010000 (Big-Endian). Aber es gibt halt auch die möglichkeit
00010000 und 00100111 abzuspeichern (Little-Endian).

Es gibt in dem Sinne also kein Byte für Byte, weil es keine fest definierte reihenfolge gibt wie eine Zahl als 2 oder 4 Bytes im Speicher vorliegt, bzw. es vom Prozessor abhängt.
Also selbst wenn ich nun die Dezimalzahl 10000 nehme, kann im Speicher einer Long 00000000'00000000'00100111'00010000 stehen, oder wie es eigentlich überlich ist 00010000'00100111'00000000'00000000.
Somit würde auch das Byte für Byte schreiben unterschiedliche Datein ergeben.

Als Handfestes Beispiel: PB speichert eine LONG im Little-Endian Format, in einem PNG liegt die Breite und Höhe des Bild aber als LONG im Big-Endian Format vor.
PB 6.01 ― Win 10, 21H2 ― Ryzen 9 3900X, 32 GB ― NVIDIA GeForce RTX 3080 ― Vivaldi 6.0 ― www.unionbytes.de
Aktuelles Projekt: Lizard - Skriptsprache für symbolische Berechnungen und mehr
DarkDragon
Beiträge: 6291
Registriert: 29.08.2004 08:37
Computerausstattung: Hoffentlich bald keine mehr
Kontaktdaten:

Re: Endianness (Bytereihenfolge) und Fingerprints

Beitrag von DarkDragon »

STARGÅTE hat geschrieben:Als Handfestes Beispiel: PB speichert eine LONG im Little-Endian Format[...]
Das ist Prozessorabhängig (siehe auch).
Angenommen es gäbe einen Algorithmus mit imaginärer Laufzeit O(i * n), dann gilt O((i * n)^2) = O(-1 * n^2) d.h. wenn man diesen Algorithmus verschachtelt ist er fertig, bevor er angefangen hat.
Mr.L
Beiträge: 51
Registriert: 05.02.2011 21:04

Re: Endianness (Bytereihenfolge) und Fingerprints

Beitrag von Mr.L »

Speichere den Fingerprint doch als String.
Oder du ermittlest ob das System Big- oder Little-Endian verwendet und schreibst/liest die Bytes in entsprechender Reihenfolge aus.

Code: Alles auswählen

num.l = $00000001
If PeekB(@num) = $01
	Debug  "Little-Endian"
Else
	Debug "Big-Endian"
EndIf
Benutzeravatar
mk-soft
Beiträge: 3902
Registriert: 24.11.2004 13:12
Wohnort: Germany

Re: Endianness (Bytereihenfolge) und Fingerprints

Beitrag von mk-soft »

Für 32bit und 64bit Compiler

Code: Alles auswählen

Procedure BSWAP32(value.l)
  !mov eax, dword [p.v_value]
  !bswap eax
  ProcedureReturn
EndProcedure
P.S. Nur 64bit Compiler

Code: Alles auswählen

Procedure BSWAP64(value.i)
  !mov rax, qword [p.v_value]
  !bswap rax
  ProcedureReturn
EndProcedure
FF :wink:
Alles ist möglich, fragt sich nur wie...
Projekte ThreadToGUI / EventDesigner V3 / OOP-BaseClass-Modul
Downloads auf MyWebspace / OneDrive
Benutzeravatar
Thorium
Beiträge: 1722
Registriert: 12.06.2005 11:15
Wohnort: Germany
Kontaktdaten:

Re: Endianness (Bytereihenfolge) und Fingerprints

Beitrag von Thorium »

Endianess ist nicht Bestandteil der Hashfunktionen, die ich kenne. Das Protokoll oder der Standard, der die Hashes verwendet legt fest wie sie gespeichert oder übertragen werden. Die meisten Netzwerkprotokolle übertragen in Big Endian.
Zu mir kommen behinderte Delphine um mit mir zu schwimmen.

Wir fordern mehr Aufmerksamkeit für umfallende Reissäcke! Bild
Benutzeravatar
STARGÅTE
Kommando SG1
Beiträge: 7039
Registriert: 01.11.2005 13:34
Wohnort: Glienicke
Kontaktdaten:

Re: Endianness (Bytereihenfolge) und Fingerprints

Beitrag von STARGÅTE »

@mk-soft: Das "drehen" ist nicht das problem, dafür habe ich auch meine Prozedur MirrorMemory()

@Thorium: Soll heißen, in MD5 oder so wird nicht festgelegt, wie die 128 Bit abgespeichert werden, also liegt die Entscheidung wie ich die 16 Byte anordne bei mir, bzw beim Nutzer der es speichert.
Auch die Stringausgabe des MD5 ist ja im Grunde nur eine Hex-Version welche im Littel oder Big-Endian Format vorliegt.

Das heißt dann aber leider, dass man ohne Hintergrundwissen, keine Chance hat vorher zu erkennen, ob der Fingerprint nun Littel- oder Big-Endian ist?
PB 6.01 ― Win 10, 21H2 ― Ryzen 9 3900X, 32 GB ― NVIDIA GeForce RTX 3080 ― Vivaldi 6.0 ― www.unionbytes.de
Aktuelles Projekt: Lizard - Skriptsprache für symbolische Berechnungen und mehr
DarkDragon
Beiträge: 6291
Registriert: 29.08.2004 08:37
Computerausstattung: Hoffentlich bald keine mehr
Kontaktdaten:

Re: Endianness (Bytereihenfolge) und Fingerprints

Beitrag von DarkDragon »

STARGÅTE hat geschrieben:Das heißt dann aber leider, dass man ohne Hintergrundwissen, keine Chance hat vorher zu erkennen, ob der Fingerprint nun Littel- oder Big-Endian ist?
Die hauptsache ist ja, dass du den Vergleich mit gleichem Endian durchführst. D.h. wenn du den Fingerprint übers Netzwerk verschickst musst du Prozessorabhängig entweder swappen oder nicht swappen.
STARGÅTE hat geschrieben:@mk-soft: Das "drehen" ist nicht das problem, dafür habe ich auch meine Prozedur MirrorMemory()
Ich bezweifle, dass du einen kompletten Speicherbereich swappen musst, sondern eher die einzelnen Worte. D.h. wenn du einen Fingerprint in einer durch 16Bit Worte aufgeteilten Struktur hast musst du jedes 16Bit Wort einzeln byteweise swappen.
Angenommen es gäbe einen Algorithmus mit imaginärer Laufzeit O(i * n), dann gilt O((i * n)^2) = O(-1 * n^2) d.h. wenn man diesen Algorithmus verschachtelt ist er fertig, bevor er angefangen hat.
Benutzeravatar
STARGÅTE
Kommando SG1
Beiträge: 7039
Registriert: 01.11.2005 13:34
Wohnort: Glienicke
Kontaktdaten:

Re: Endianness (Bytereihenfolge) und Fingerprints

Beitrag von STARGÅTE »

DarkDragon hat geschrieben:Ich bezweifle, dass du einen kompletten Speicherbereich swappen musst, sondern eher die einzelnen Worte. D.h. wenn du einen Fingerprint in einer durch 16Bit Worte aufgeteilten Struktur hast musst du jedes 16Bit Wort einzeln byteweise swappen.
Soll heißen: In einem MD5 wo mit der Wortgröße 32Bit ein 128Bit Fingerprint erstellt wird, bleibt die Wortreihenfolge egal ob Littel oder Big-Endian die selbe? Es wird also immer nur das Wort selbst gedreht?
PB 6.01 ― Win 10, 21H2 ― Ryzen 9 3900X, 32 GB ― NVIDIA GeForce RTX 3080 ― Vivaldi 6.0 ― www.unionbytes.de
Aktuelles Projekt: Lizard - Skriptsprache für symbolische Berechnungen und mehr
Antworten