Burada iyi cevaplar var, ama bitsel operasyonların herhangi bir gösterisini görmüyorum. Visser (şu anda kabul edilen cevap) dediği gibi, Java varsayılan olarak tamsayılar imzalar (Java 8 imzasız tamsayılara sahiptir, ancak bunları hiç kullanmadım). Daha fazla uzatmadan yapalım ...
RFC 868 Örneği
ES'ye işaretsiz bir tam sayı yazmanız gerekirse ne olur? Pratik örnek, zamanı RFC 868'e göre çıkarmak istediğiniz zamandır . Bu, 1 Ocak 1900'den bu yana saniye sayısını kodlayan 32 bit, big-endian, işaretsiz bir tam sayı gerektirir. Bunu nasıl kodlarsınız?
Kendi imzasız 32 bitlik tam sayınızı şu şekilde yapın:
4 bayt (32 bit) bayt dizisi bildirme
Byte my32BitUnsignedInteger[] = new Byte[4] // represents the time (s)
Bu diziyi başlatır, bkz. Bayt dizileri Java'da sıfırlandı mı? . Şimdi dizideki her baytı big-endian düzenindeki bilgilerle (veya tahribatı yıkmak istiyorsanız little-endian) doldurmanız gerekir. Uzun bir süreye sahip olduğunuzu varsayarsak (Java'da uzun tamsayılar 64 bit uzunluğundadır) denir secondsSince1900
(Bu yalnızca ilk 32 biti kullanır ve Tarih'in 12:00 AM 1 Ocak 1970'e başvurduğunu), mantıksal AND'i kullanarak bitleri ayıklayabilir ve bu bitleri bir Byte'a girildiğinde göz ardı edilmeyecek konumlara (basamaklar) ve büyük endian düzenine kaydırabilirsiniz.
my32BitUnsignedInteger[0] = (byte) ((secondsSince1900 & 0x00000000FF000000L) >> 24); // first byte of array contains highest significant bits, then shift these extracted FF bits to first two positions in preparation for coersion to Byte (which only adopts the first 8 bits)
my32BitUnsignedInteger[1] = (byte) ((secondsSince1900 & 0x0000000000FF0000L) >> 16);
my32BitUnsignedInteger[2] = (byte) ((secondsSince1900 & 0x000000000000FF00L) >> 8);
my32BitUnsignedInteger[3] = (byte) ((secondsSince1900 & 0x00000000000000FFL); // no shift needed
Bizim my32BitUnsignedInteger
şimdi işaretsiz 32 bit, big-endian tamsayı denk olduğunu RCF 868 standardına yapışır. Evet, uzun veri tipi imzalandı, ancak bu gerçeği görmezden geldik, çünkü saniyelerSizin1900'ün yalnızca daha düşük 32 bit kullandığını varsaydık). Uzunluğu bir bayta zorladığından, 2 ^ 7'den (onaltılık ilk iki basamak) daha yüksek olan tüm bitler göz ardı edilir.
Referans verilen kaynak: Java Network Programming, 4th Edition.