Endianness (Bytereihenfolge) und Fingerprints
Endianness (Bytereihenfolge) und Fingerprints
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.
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
Aktuelles Projekt: Lizard - Skriptsprache für symbolische Berechnungen und mehr
Re: Endianness (Bytereihenfolge) und Fingerprints
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?
geben, oder irre ich mich?
Re: Endianness (Bytereihenfolge) und Fingerprints
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.
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
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
Das ist Prozessorabhängig (siehe auch).STARGÅTE hat geschrieben:Als Handfestes Beispiel: PB speichert eine LONG im Little-Endian Format[...]
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.
Re: Endianness (Bytereihenfolge) und Fingerprints
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.
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
Re: Endianness (Bytereihenfolge) und Fingerprints
Für 32bit und 64bit Compiler
P.S. Nur 64bit Compiler
FF 
Code: Alles auswählen
Procedure BSWAP32(value.l)
!mov eax, dword [p.v_value]
!bswap eax
ProcedureReturn
EndProcedure
Code: Alles auswählen
Procedure BSWAP64(value.i)
!mov rax, qword [p.v_value]
!bswap rax
ProcedureReturn
EndProcedure
Alles ist möglich, fragt sich nur wie...
Projekte ThreadToGUI / EventDesigner V3 / OOP-BaseClass-Modul
Downloads auf MyWebspace / OneDrive
Projekte ThreadToGUI / EventDesigner V3 / OOP-BaseClass-Modul
Downloads auf MyWebspace / OneDrive
Re: Endianness (Bytereihenfolge) und Fingerprints
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!
Wir fordern mehr Aufmerksamkeit für umfallende Reissäcke!

Re: Endianness (Bytereihenfolge) und Fingerprints
@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?
@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
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
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: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?
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.STARGÅTE hat geschrieben:@mk-soft: Das "drehen" ist nicht das problem, dafür habe ich auch meine Prozedur MirrorMemory()
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.
Re: Endianness (Bytereihenfolge) und Fingerprints
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?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.
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
Aktuelles Projekt: Lizard - Skriptsprache für symbolische Berechnungen und mehr