2012-03-20 19 views
5

C# dünyasından gelip Java üzerinde fırçalayarak, imzasız bayt/ints olmadığını öğrendim. Ben aşağıdaki örnekte olduğu gibi özel ikili mesajlar kurmak kolay yolu ne olduğunu bulmaya çalışıyorum: Gördüğünüz gibi, belirli tamsayı değerleri 3 bitlik yuvaya koymak gerekirJava'da özel ikili veri iletileri ayarlamanın en kolay yolu nedir?

enter image description here

. Diğer değerler ise tek bitli bayraklar veya diğer boyut alanlarıdır. Okuduklarımdan, bit bilge operatörlerini kullanarak tamsayılarda ikili bayt oluşturma gibi "bir sonraki büyük" ilkelde çalışmalıyım. Başka yollar var mı? Ben başka bir yerde gibi bulduğumuz bazı örnekler izlemiştir (Not: Bu örnek, yukarıdaki grafiği eşleşmiyor):

shiftedValue1 = (value1 & 0xFF) << 5; 
shiftedValue2 = (Value2 & 0xFF) << 2; 
shiftedValue3 = (Value3 & 0xFF) << 1; 
shiftedValue4 = (Value4 & 0xFF); 
finalvalue = (shiftedValue1 & 0xFF) | (shiftedValue2 & 0xFF) | (shiftedValue3 & 0xFF) | (shiftedValue4 & 0xFF); 

bu bayt oluşturmak için daha iyi bir yolu var mı yapılandırılmış ilk byte alınır? 4 bayt alanları üzerinde ne kullanırım? Uzun?

+0

Belki de clueless değilim, ama - imzasız değerler gibi bu tür alanları görüntüleme geleneğine rağmen, bunları imzalı değerler olarak işlemek herhangi bir gerçek sorun var mı? Eğer C# 'da, verilen bir byte alanını 0 ('' '') ile 255 ('FF') arasında bir aralıkta görüyorsanız, 0 ile 127 (' 00' - '' arasında bir aralıkta bir zararı var demektir. 7F ') ve -128 ila -1 ('80'den' FF''ye)? Çalıştığım yerde, bazı ortaklarımız/müşterilerimiz tam olarak bunu yapıyor; Bir C enumda '0x85' olarak görünen bir değer, bir XML özniteliğinde "-123" olarak görünecektir. Kulağa biraz tuhaf geliyor, ama hiçbir zaman sorun yaratmadı. – ruakh

+0

Aslında bu yönde gitmeyi deneyebilirim ... – kuhnto

cevap

1

Bu, byte[] (bayt dizileri) veya BitSet s kullanılarak daha kolay yapılabilir.

+0

Orijinal olarak bir bayt [] kullanmayı düşünüyordum ama anladığım kadarıyla bir bayt dizisindeki bayt hala imzalandı ve bu işlem için biraz "manipülasyon" gerekiyor. – kuhnto

1

Açıklandığı gibi ByteBuffer kullanabilirsiniz. here. Bayt dizisini, özellikle endianess gibi şeyleri hesaba katmayı kolaylaştıracaktır.

+0

Bu gerçekten iyi bir yazı. – kuhnto

İlgili konular