SORU
1 Mayıs 2009, Cuma


64 bit ntohl() C ?

htonl() man sayfaları, yalnızca 32 bit değerleri için kullanabileceğiniz işaret ediyor. (Gerçekte, ntohl() benim platformunda 32 bit olduğu imzasız uzun süre tanımlanmış. Eğer işaretsiz long 8 Byte olsaydı, 64 bit in çalışma) sanırım öyle olacak.

Benim sorunum küçük indian büyük indian 64 bit tamsayı (benim durumumda, bu bir işaretsiz uzun uzun) dönüştürmek istiyorum. Şu anda, belirli bir dönüşüm yapmak istiyorum. Ama eğer işlevi (ntohl()) hedef platform büyük indian olsaydı 64 bit değerimi dönüştürmek istiyorsunuz olmasa çok daha güzel olurdu. (Daha doğrusu benim kendi işleyişi bunu) sihir ekleyerek önlemek istiyorum.

Ne kullanabilirim? Eğer varsa, standart bir şey istiyorum, ama uygulama her türlü öneriye açığım. Bu tür bir dönüştürme geçmiş sendikaları kullanarak yapıldığını gördüm. İmzasız uzun bir uzun ve bir char[8] ile bir birlik sanıyorum. Sonra takas buna göre etrafında bayt. (Belli ki büyük indian olduğunu platformlarda kırar).

CEVAP
10 Aralık 2010, Cuma


Belgeleri: Linux üzerinde man htobe64 (abone olarak giriş >= 2.9) ya da FreeBSD.

Ne yazık ki OpenBSD, FreeBSD ve abone olarak giriş (Linux) birlikte oldukça düzgün işe yaramadı bir tane oluşturmak için (non-çekirdek API) 2009 yılında bir girişim sırasında bu standart C kütüphanesi,.

Şu anda, basit bir kod bu kısa bit:

#if defined(__linux__)
#  include <endian.h>
#elif defined(__FreeBSD__) || defined(__NetBSD__)
#  include <sys/endian.h>
#elif defined(__OpenBSD__)
#  include <sys/types.h>
#  define be16toh(x) betoh16(x)
#  define be32toh(x) betoh32(x)
#  define be64toh(x) betoh64(x)
#endif

(Linux ve OpenBSD üzerinde test) farklılıkları gizlemek. Bu 4 platformları üzerinde FreeBSD tarzı Linux/makrolar verir.

Örnek kullanım:

  #include <stdint.h>    // For 'uint64_t'

  uint64_t  host_int = 123;
  uint64_t  big_endian;

  big_endian = htobe64( host_int );
  host_int = be64toh( big_endian );

En çok ta "standart C kütüphanesi"gibi bir yaklaşım mevcut şu anda.

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

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • DeAdPiXel6667

    DeAdPiXel666

    2 Ocak 2010
  • George McCarron

    George McCar

    29 Mayıs 2013
  • SerienTrailerMP

    SerienTraile

    7 HAZİRAN 2012

İLGİLİ SORU / CEVAPLAR