swap 16 bit - 32 bit sorunu

Delphi'de kod yazma ile ilgili sorularınızı bu foruma yazabilirsiniz.
Cevapla
Kullanıcı avatarı
seandillon
Üye
Mesajlar: 50
Kayıt: 04 Nis 2006 11:14
Konum: istanbul
İletişim:

swap 16 bit - 32 bit sorunu

Mesaj gönderen seandillon »

İyi günler herkese;
Bugünlerde fazla soru soruyorum ama kusura bakmayın lütfen;
benim yeni sorum şu;
farklı bir network ortamından gelmiş bilgi maalesef uyuşmuyor. Gelen bilgi little endian ve maalesef delphi big endian.
8 ve 16 bitlik gelen bilgilerde swap komutu ile bunu değiştirebiliyorum fakat bunu 32 bite uyguladığım zaman maalesef başarısız oluyorum. İnternetten araştırdığım zaman bunun için bulduğum tek yanıt ise
" longint shr 16 " ile yapmak ama buda sadece ilk 2 byte iç.in değer veriyor maalesef 32 bitlik bir bilgiyi çevirmiyor.
Hayatta iki şey paylaşmaya değer, sevgi ve bilgi. sevgisiz bilgi, bilgisiz sevgi olmaz...
Kullanıcı avatarı
mrmarman
Üye
Mesajlar: 4741
Kayıt: 09 Ara 2003 08:13
Konum: İstanbul
İletişim:

Re: swap 16 bit - 32 bit sorunu

Mesaj gönderen mrmarman »

CodeGear'da verilmiş örnek. bkz. http://dn.codegear.com/article/28964

Kod: Tümünü seç

type
  //enumeration used in variant record
  BytePos = (EndVal, ByteVal);

  PEndianCnvRec = ^EndianCnvRec;
  
  EndianCnvRec = packed record
    case pos: BytePos of
       //The value we are trying to convert
      EndVal: (EndianVal: double);           
       //Overlapping bytes of the double
      ByteVal: (Bytes: array[0..SizeOf(Double)-1] of byte); 
  end;

//A gets B's values swapped
procedure SwapBytes( A, B: PEndianCnvRec );
var
  i: integer;
begin
  for i := high(A.Bytes) downto low(A.Bytes) do
    A.Bytes[i] := B.Bytes[High(A.Bytes) - i];
end;
Kullanımı ise

Kod: Tümünü seç

procedure TForm1.Button1Click(Sender: TObject);
var
  a,b,c: EndianCnvRec;
begin
  a.EndianVal := 23344.55555;
  SwapBytes(@b,@a);
  ShowMessage(FloatToStr(b.EndianVal));
  SwapBytes(@c,@b);
  ShowMessage(FloatToStr(c.EndianVal));
end;
Resim
Resim ....Resim
Cevapla