SORU
24 AĞUSTOS 2011, ÇARŞAMBA


Ne zaman Endianness bir faktör haline gelir?

Anladığım kadarıyla Endianness, boş bir kelime oluşturan bayt en azından en tipik durumda onların düzeni farklı, zaman. 16-bit bir tamsayı ya da 0xHHLL 0xLLHH olarak saklanabilir.

Bilmek istediğim, bu yanlış, yok varsayarak Endianness, İndian olabilir ya da farklı olmayabileceği, iki bilgisayar arasında bilgi gönderirken önemli bir faktör haline gelir.

  • Ben char dizisi şeklinde 1, kısa bir tamsayı iletmek ve herhangi bir düzeltme ile, alınan ve 256 olarak interpretted?

  • Eğer ben ve kısa tamsayı aşağıdaki kodu kullanarak ayrıştırmak oluşması durumunda, endianness artık bir etkisi olacak mı?

    // Sender:
    for(n=0, n < sizeof(uint16)*8;   n) {
        stl_bitset[n] = (value >> n) & 1;
    };
    
    // Receiver:
    for(n=0, n < sizeof(uint16)*8;   n) {
        value |= uint16(stl_bitset[n] & 1) << n;
    };
    
  • Endianness telafi için standart bir yolu var mı?

Şimdiden teşekkürler!

CEVAP
24 AĞUSTOS 2011, ÇARŞAMBA


Çok soyut konuşan, endianness char dizisi olarak bir değişken yeniden yorumlanması bir özellik.

Pratik olarak, bu 6 ** dış bayt akışı (bir dosya ya da bir yuva gibi) ve write() kesin olarak ne zaman önemli. Ya da, yine soyut konuşma, sen ne zaman endianness önemliseri hale getirmekveriler aslında Seri Veri türü sistem var ve sadece aptal bayt içerir çünkü); ve endiannessdeğilönemli değiliçindedil sadece üzerinde çalıştığından programlama dili,değerlerdeğilgösterimi. Ayrıntıları kazmak için gereken birinden diğerine gidiyor.

Wit - yazma:

uint32_t n = get_number();

unsigned char bytesLE[4] = { n, n >> 8, n >> 16, n >> 24 };  // little-endian order
unsigned char bytesBE[4] = { n >> 24, n >> 16, n >> 8, n };  // big-endian order

write(bytes..., 4);

Burada sadece dedi, reinterpret_cast<unsigned char *>(&n) ve sonuç sisteminin endianness bağlı olurdu.

Ve okuma

unsigned char buf[4] = read_data();

uint32_t n_LE = buf[0]   buf[1] << 8   buf[2] << 16   buf[3] << 24; // little-endian
uint32_t n_BE = buf[3]   buf[2] << 8   buf[1] << 16   buf[0] << 24; // big-endian

Yine, burada dedi, uint32_t n = *reinterpret_cast<uint32_t*>(buf) ve sonuç makine endianness bağlı olurdu.


Gördüğünüz gibi, integral çeşitleri ile asla eğer cebirsel giriş ve çıkış işlemleri kullanırsanız kendi sisteminizin endianness, veri akışı sadece bilmek zorunda. double gibi diğer veri türleri ile sorun daha karmaşıktır.

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • Apple

    Apple

    22 HAZİRAN 2005
  • Sali Kaceli

    Sali Kaceli

    24 ŞUBAT 2009
  • whatever

    whatever

    30 EYLÜL 2005