Big/Little Endian dönüşümü

Başlatan z, 11 Haziran 2012, 12:27:55

z

Bir structure, byte tipindeki alanların yanısıra 2 bytelık word tanımlı alanlar da içeriyor.
Bu structure'ın özelliğini verdiğim arrayin içi, seri iletişim kanalaından gelen verilerle windows fonksiyonu sayesinde doldurulmaktadır. (Bu aşamaya müdahale edemiyorum)

Ancak array içine yerleşmiş word tipindeki verilerin High/Low byte'larının sıralaması tersdir.

Şu anda word tipi verileri yazdığım bir kod parçası ile tek tek düzeltiyorum.

Bunun yerine structure tanımı yaparken özel tanım yapılabilirmi? Yada H/L sıralamasını değiştiren hazırda komut yada fonksiyon varmı?

Atıyorum structure'da word tanımı yerine Reverse word benzeri bir tanım olsa, bunun içine tersden yerleşmiş word veriler okunurken düzeltilerek okunsa umuduyla böyle bir tanım varmı diye soruyorum.
Bana e^st de diyebilirsiniz.   www.cncdesigner.com

bocek

1 ya da 0. işte 'bit'ün mesele..

z

Cevap icin tesekkurler. Benzer donusumu ben de kodla yapiyorum fakat word, integer gibi birden fazla byte barindiran verileri Delphide big/Little endian tanimlamak mumkunmu onu merak ediyordum.

Yazarken Big Endian yazilsin ama okurken Little Endian okunsun gibi bir durum olabilirmi diye merak ediyorum.
Bana e^st de diyebilirsiniz.   www.cncdesigner.com

mistek

Endian konusuna ve hafıza organizasyonlarına çok aşina değilim ama biyere takıldım.

Stm32f107 reference manual de diyor ki. "The bytes are coded in memory in Little Endian format."

Şimdi little/big endian kavramını araştırdım az çok anladım gibi.

Sorum şu:
İşlemcinin "falanca" bellek adresine 0x12345678 yazmak istiyorum.
falanca = 0x12345678 olarak C derleyicisinde yazdığımda ve bu registerın alt ve üst 16 bitini bölüp başka yere aldığımda nasıl göreceğim?
1.)
falanca_üst = 1234
falanca_alt =  5678

2.)
falanca_üst =  5678
falanca_alt = 1234

ASM olarak yazdığımızda mı durum farklı oluyor?
Derleyiciye sen onları big endian olarak koy diyebilir miyim?
Neden bu şekilde bir ayrıma ihtiyaç duyulmuş?

Yada bu endian takımının programcıyı ilgilendiren bir kısmı yok mu?
Bırakalım nasıl istiyorsa öyle yerleştirsin ama bize yüksek anlamlı bitleri sol tarafta düşük anlamlı bitleri sağ tarafta getirsin mi diyoruz?

Hafızada nasıl yerleşiyorlar? Kafam karıştı belkide konuyu çok yanlış anlamış olabilirim. Yardımcı olursanız memnun olurum.
boş işlerin adamı ---- OHM Kanunu: I = V/R ---- Güç Formülü: P = V*I = I^2*R = V^2/R

mistek

Alıntı yapılan: gerbay - 18 Ağustos 2013, 23:59:51
Dikkat ederseniz bitler demiyor, byte lar diyor..

Bunun sebebi zamaninda intel ve motorola nin farkli yogurt yeyişleri. Bazi islemcilerde siz little ya da big endian çalış diyebiliyorsunuz.

Diyelimki siz 32 bitlik bir degisken kullaniyorsunuz, degeri 0x12345678 olsun. Bu degisken memoryde biryerlerde ve 4 byte yer isgal ediyor. Siz degskenn bulundugu yeri byte byte incelerseniz little endian sistemlerde bu 4 byte i 0x78 0x56 0x34 0x12 seklinde gorursnuz. Big endian sstemerde ise 0x12 0x34 0x56 0x78 seklinde gorursnuz.

İntel x86 ailesi little endiandir. Motorola 68k serisi ve sonrasina powerPC ailesi bg endian dir. Arm larin çoğu little endian, bir kismi big endian, bir kismi da konfigure edilebilirdir.

Java her platformda big endiandir. Pci bus little endiandir. Network byte order big endiandir. Yani, tcp,udp,ip ... big endian dir.

Kod yazarken little-big dönüşümleri yaziimcilarin kod ile yapmasi gerekir.

Hocam tamam buraya kadar olan kısmı az çok anladım ama halen ben değişkeni sakladıktan sonra geri alırken oluşacak durumu anlayamıyorum.
----------
"degskenn bulundugu yeri byte byte incelerseniz little endian sistemlerde bu 4 byte i 0x78 0x56 0x34 0x12 seklinde gorursnuz. Big endian sstemerde ise 0x12 0x34 0x56 0x78 seklinde gorursnuz."
----------

Ozaman endian durumuna dikkat etmeyip yüksek anlamlı 2 baytı okuduğumda aslında düşük anlamlı 2 baytı okumuş olacağım değil mi?

Tam ifade edemiyorum. Biraz daha araştırayım.
boş işlerin adamı ---- OHM Kanunu: I = V/R ---- Güç Formülü: P = V*I = I^2*R = V^2/R

mufitsozen

#5
Alıntı yapılan: gerbay - 18 Ağustos 2013, 23:59:51
Dikkat ederseniz bitler demiyor, byte lar diyor..

Bunun sebebi zamaninda intel ve motorola nin farkli yogurt yeyişleri. Bazi islemcilerde siz little ya da big endian çalış diyebiliyorsunuz.

Diyelimki siz 32 bitlik bir degisken kullaniyorsunuz, degeri 0x12345678 olsun. Bu degisken memoryde biryerlerde ve 4 byte yer isgal ediyor. Siz degskenn bulundugu yeri byte byte incelerseniz little endian sistemlerde bu 4 byte i 0x78 0x56 0x34 0x12 seklinde gorursnuz. Big endian sstemerde ise 0x12 0x34 0x56 0x78 seklinde gorursnuz.

İntel x86 ailesi little endiandir. Motorola 68k serisi ve sonrasina powerPC ailesi bg endian dir. Arm larin çoğu little endian, bir kismi big endian, bir kismi da konfigure edilebilirdir.

Java her platformda big endiandir. Pci bus little endiandir. Network byte order big endiandir. Yani, tcp,udp,ip ... big endian dir.

Kod yazarken little-big dönüşümleri yaziimcilarin kod ile yapmasi gerekir.
sevgili gerbay,

bu mesele intel-motorola gibi bilinir ama aslinda pdp-11 mimarisi ile ortaya cikmistir.

byte sirasi konusunda yanlisin var



yani 0x12345678 yazilinca 0x34017856 diye saklanir!

dedim ama galiba ihtiyarliktan yanlis dediö ozur :-[ ???
Aptalca bir soru yoktur ve hiç kimse soru sormayı bırakana kadar aptal olmaz.

Veli B.

#6
Bir yanlışlık yok mu Abi?

Data birimi Byte olduğunda;
0x78:0x56:0x34:0x12

data birimi word olduğunda ;
0x5678 0x1234 gitmez mi?

Olayın özü;
tüm paket içinde ki  MSB(LE) veya LSB(BE) bitini içeren data birimin önce gönderilmesi değil mi?

mistek

#7
Bellekte 16bit sayı üzerinden anlamaya çalışayım.
Data saklama formatı byte.
Sayım 0x1234 olsun.
Kodu C de yazdığımızı düşünelim derleyici ard arda biyere saklasın.

Big endian için;
1. adres: 0x12
2. adres: 0x34

Little endian
1.adres: 0x34
2.adres: 0x12

Ben sayımın düşük anlamlı 1 byte ına ulaşmak istediğimde
sayı &= 0x00FF; dersem eğer big ve little endian da aynı sonucu alamayacağım değil mi?
Yoksa C/derleyici bu konuda bize yardımcı oluyor mu? Little kaydettin ama ben sana big endian şeklinde veriyorum gibi...


Ek olarak:
Şimdiye kadar böyle bi durum olduğunu farketmedim bile mutlu yaşamıma devam ediyordum. Nxp de sayı &= 0x00FF; şeklindeki ifade bana 0x34 sonucunu veriyordu. (Yoksa vermedi mi?  :'( )



boş işlerin adamı ---- OHM Kanunu: I = V/R ---- Güç Formülü: P = V*I = I^2*R = V^2/R

mistek

Hocam çok teşekkürler. Farklı endianlarla çalışana kadar bu konuda da artık içim rahat.
boş işlerin adamı ---- OHM Kanunu: I = V/R ---- Güç Formülü: P = V*I = I^2*R = V^2/R