Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi Hex-String nach Binärwert durchsuchen (https://www.delphipraxis.net/84877-hex-string-nach-binaerwert-durchsuchen.html)

hirnstroem 23. Jan 2007 08:34


Hex-String nach Binärwert durchsuchen
 
'loha Folks,

eine Adresse (Hexadezimalwert) wird mit einer UserID verodert:

Address := Address or (UserID shl 21);

Wie bekomme ich jetzt am einfachsten die UserID wieder raus? Ich komm nich drauf.

Grüsse
hirnstroem

Muetze1 23. Jan 2007 08:35

Re: Hex-String nach Binärwert durchsuchen
 
gar nicht?

hirnstroem 23. Jan 2007 08:54

Re: Hex-String nach Binärwert durchsuchen
 
So so, also ich bin mittlerweile anderer Meinung.

Man erstelle eine Maske welche die herauszufindenden Bits mit Einsen überdeckt. Der rest wird mit nullen gefüllt, die ganze Sache verundert und voilà...

Christian Seehase 23. Jan 2007 08:59

Re: Hex-String nach Binärwert durchsuchen
 
Moin Hirnstroem,

geht trotzdem nicht.
Sobald die UserID an einer Stelle ein 0-Bit hat, und die Adresse ein 1-Bit geht's schief.

shmia 23. Jan 2007 09:02

Re: Hex-String nach Binärwert durchsuchen
 
Es gibt Operationen, die sind umkehrbar und andere, die NICHT umkehrbar sind.
Dein Beispiel ist nicht umkehrbar. Mit einer kleiner Änderung gehts aber doch:
Delphi-Quellcode:
Address2 := (Address and $000FFFFF) or (UserID shl 21);
Und wieder zurück:
Delphi-Quellcode:
Adress := Address2 and $000FFFFF;
UserID := Address2 shr 21;
Natürlich haben UserID und Adress einen begrenzten Wertebereich!

sirius 23. Jan 2007 09:05

Re: Hex-String nach Binärwert durchsuchen
 
Ein XOR ist auch hervorragend umkehrbar:

A= (A XOR B) XOR B

hirnstroem 23. Jan 2007 10:41

Re: Hex-String nach Binärwert durchsuchen
 
Okay, ich habe wohl noch etwas verschwiegen. Die Adresse besteht in meinem Falle immer aus 29 Bit (eigentlich 32), von welchen die Adresse selbst nur jeweils die ersten 9 (LSB) benötigt. Die nächsten neun wären eine Server Adresse, dann gibts es noch drei Bits für andere Informationen, die nächsten fünf stellen die UserID dar und die letzten drei beherbergen die Priorität.

Jedenfalls sieht so eine Adresse immer in etwa so aus:

11100000111101010101101010101
****^^
Da diese fünf Bits für die UserID vorgesehen sind, sind sie immer 0, bis sie mit der UserID, welche 21 Stellen nach links verschoben wird verodert werden.

Die 5 Bits bekommt man nun wieder raus, indem eine passende Maske mit dem ganzen verundert wird. Die Maske ist nichts anderes als die Adresse (11100000111101010101101010101) durchgehend mit Nullen versehen, bis auf die Stelle, an welche die UserID gehört, dort müssen Einsen hin. So also: 00011111000000000000000000000

Das ergäbe dann UserID := Address and Maske shr 21

Das Ergebnis ist nun immer genau die UserID. An und für sich einfach, sofern man sich an den Mathematikunterricht erinnern könnte...

Vielen Dank einenweg

Muetze1 23. Jan 2007 11:21

Re: Hex-String nach Binärwert durchsuchen
 
Ja, da muss ich dir zustimmen. Hättest du uns diese Informationen bzw. Eigenheiten von Address vorher mitgeteilt, dann hätte man sie einfach wieder rausholen können. Aber da du keine Einschränkungen gemacht hast, sind alle Bits in Benutzung und wenn das der Fall ist, kannst du das nicht wieder herausholen.

Mit Masken und Bit-Shiftereien sowie logischen Operatoren können wir auch umgehen, aber grundsätzlich poste ich keine Lösungen, wenn sie nicht uneingeschränkt nutzbar wäre für die Fragestellung - und das wäre sie nicht gewesen.


Alle Zeitangaben in WEZ +1. Es ist jetzt 22:48 Uhr.

Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz