Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   Schiebeoperationen (https://www.delphipraxis.net/63365-schiebeoperationen.html)

maynard 17. Feb 2006 17:08


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:
wert = 222;
wert = (111 << 8);
wert = (0 << 8);
wert = (111 << 8);
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?

Bernhard Geyer 17. Feb 2006 17:14

Re: Schiebeoperationen
 
Code:
wert = 222;
wert = (wert << 8) + 111;
wert = (wert << 8);
wert = (wert << 8) + 111;

Khabarakh 17. Feb 2006 17:16

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:
wert = 222 << 24 | 111 << 16 | 111;
In diesem Fall würde auch + statt OR funktionieren, so finde ich es allerdings logischer.

[edit]Roter Kasten, wo bist du :gruebel: ? [/edit]

maynard 17. Feb 2006 17:21

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

maynard 18. Feb 2006 14:33

Re: Schiebeoperationen
 
Tach...

Und wie funktioniert der Weg zurück ... also aus einem 32Bit Long 4 Byes zu extrahieren?

MfG

Khabarakh 18. Feb 2006 14:58

Re: Schiebeoperationen
 
Code:
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;
}
Wahrscheinlich nicht direkt nach C übernehmbar, aber die Vorgehensweise sollte erkennbar sein.

JasonDX 18. Feb 2006 16:00

Re: Schiebeoperationen
 
In C kann man lustige Spielchen treiben (wenn mich nicht alles täuscht):
Code:
void Bla(unsigned long data)
{
  byte* bytes = (byte*)(&data);
  hoechstwertigesBit = bytes[0];
  //...
  niederwertigstesBit = bytes[3];
}
is halt etwas kürzer ;)

greetz
Mike

Khabarakh 18. Feb 2006 16:12

Re: Schiebeoperationen
 
In C gibt es Unions, oder? Wenn ja, wäre das wohl der kürzeste Weg ohne Bit-Shifting :wink: .

glkgereon 18. Feb 2006 16:16

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:
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;
oder so:

Delphi-Quellcode:
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;
und noch eine :-)

es gibt in C doch eine funktion die Memory kopiert, oder?

Delphi-Quellcode:
MemCP(@IP, @I, 4);
o.ä....

Khabarakh 18. Feb 2006 16:47

Re: Schiebeoperationen
 
Zitat:

Zitat von glkgereon
was sind unions?

Die solltest du auch als Delphiprogrammierer kennen.
Delphi-Quellcode:
type
  TIP = record
    case Boolean of
        true: (IP: Cardinal);
        false: (IPParts: Array[0..3] of Byte);
  end;
Zitat:

Delphi-Quellcode:
PIP = @TIP; //Pointer auf TIP(?)

Naja, nicht ganz :wink: .
Delphi-Quellcode:
PIP = ^TIP;


Alle Zeitangaben in WEZ +1. Es ist jetzt 08:33 Uhr.
Seite 1 von 2  1 2      

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