![]() |
Schiebeoperationen
Tach...
ich hänge grade etwas ... ich möchte aus 4 bytes (die jeweils einen Token einer IP enthalten) einen 32Bit - Longw machen. Allerdings komme ich mit dem schieben nicht ganz klar Wenn ich also folgende IP habe: 222.111.000.111, dann hatte ich folgendermaßen begonnen
Code:
aber so haut das eben nicht hin. Leider hab ich bisjetzt keine besonders gute Erklärung im Inet gefunden, kann mir da mal jemand kurz helfen?
wert = 222;
wert = (111 << 8); wert = (0 << 8); wert = (111 << 8); |
Re: Schiebeoperationen
Code:
wert = 222;
wert = (wert << 8) + 111; wert = (wert << 8); wert = (wert << 8) + 111; |
Re: Schiebeoperationen
Ich weiß zwar nicht, welche Programmiersprache das ist, aber wird sich sicher nicht sehr von C# unterscheiden (wenn es das nicht sowieso schon ist :wink: ).
Code:
In diesem Fall würde auch + statt OR funktionieren, so finde ich es allerdings logischer.
wert = 222 << 24 | 111 << 16 | 111;
[edit]Roter Kasten, wo bist du :gruebel: ? [/edit] |
Re: Schiebeoperationen
Tach
Verdammt, ich hätte mal lieber den kompletten Text über Bitoperationen und nich nur Schiebeoperatoren lesen sollen, dann wäre ich wohl auch drauf gekommen :lol: Danke ihr habt mir sehr geholfen, schreibe es übrigens in C. MfG |
Re: Schiebeoperationen
Tach...
Und wie funktioniert der Weg zurück ... also aus einem 32Bit Long 4 Byes zu extrahieren? MfG |
Re: Schiebeoperationen
Code:
Wahrscheinlich nicht direkt nach C übernehmbar, aber die Vorgehensweise sollte erkennbar sein.
ulong ip = 222ul << 24 | 111ul << 16 | 111ul;
byte[] ipParts = new byte[4]; for (int i = 0; i < 4; i++) { // 3 - i oder i, in welcher Reihenfolge man es eben haben will ipParts[3 - i] = (byte)(ip >> (8 * i) & 0xff); // oder auch ipParts[3 - i] = (byte)(ip & 0xff); ip >>= 8; } |
Re: Schiebeoperationen
In C kann man lustige Spielchen treiben (wenn mich nicht alles täuscht):
Code:
is halt etwas kürzer ;)
void Bla(unsigned long data)
{ byte* bytes = (byte*)(&data); hoechstwertigesBit = bytes[0]; //... niederwertigstesBit = bytes[3]; } greetz Mike |
Re: Schiebeoperationen
In C gibt es Unions, oder? Wenn ja, wäre das wohl der kürzeste Weg ohne Bit-Shifting :wink: .
|
Re: Schiebeoperationen
was sind unions?
gibt es nicht sowas wie packed records? ich hab länger nichts mehr mit C gemacht, aber die Idee mal in Delphi:
Delphi-Quellcode:
oder so:
TIP = packed record
I1, I2, I3, I4: Byte; end; PIP = @TIP; //Pointer auf TIP(?) PInt = @LongInt; //Pointer auf LongInt(?) procedure IP2Int; var IP: PIP; I: PInt; begin I:=PIP; end; procedure Int2IP; var IP: PIP; I: PInt; begin I:=PIP; end;
Delphi-Quellcode:
und noch eine :-)
var
P: Pointer IP: TIP; I: LongInt; begin P:=@I; IP:=^P; //und umkehrt.... { Prinzip: Mach Pointer auf Quelle (egal welche) nimm Pointer und dereferenziere ihn in das Ziel rein... } end; es gibt in C doch eine funktion die Memory kopiert, oder?
Delphi-Quellcode:
o.ä....
MemCP(@IP, @I, 4);
|
Re: Schiebeoperationen
Zitat:
Delphi-Quellcode:
type
TIP = record case Boolean of true: (IP: Cardinal); false: (IPParts: Array[0..3] of Byte); end; Zitat:
Delphi-Quellcode:
PIP = ^TIP;
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 07:46 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