2012-10-11 25 views
5

İkili veri akışını işlemek için bazı kod yazıyorum. Bayt dizileriyle temsil edilen parçalar halinde alınır. Birleştirildiğinde, bayt dizileri, her biri aynı sabit terminatör değeriyle (benim durumumda 0xff) biten sıralı mesaj akışını temsil eder. Bununla birlikte, sonlandırıcı değeri, verili herhangi bir veri yığınının herhangi bir noktasında görünebilir. Tek bir yığın, bir iletinin, birden çok iletinin ve aralarındaki herhangi bir şeyin bir bölümünü içerebilir. İşte Java'da ikili veri belirleme

bu işlediği veri nasıl görünebileceğini bazılarını bulabilirsiniz: Ben işlemek için küçük bir sınıf yazdım

[0x00, 0x0a, 0xff] 
[0x01, 0x01, 0x01, 0xff] 
[0x01, 0xff] 

: Bu veriler bu mesajlardan dönüşmesi gerekmektedir

[0x00, 0x0a, 0xff, 0x01] 
[0x01, 0x01] 
[0xff, 0x01, 0xff] 

bu. Daha sonra bir tampon dizisine yerleştirilen bayt dizisi biçiminde bazı veriler eklemek için bir yöntem vardır. Sonlandırıcı karakteri ile karşılaşıldığında, bayt dizisi temizlenir ve iletinin tamamı, bir ileti sırasına yerleştirilir; bu, hasNext() ve next() yöntemleri kullanılarak (bir yineleyiciye benzer şekilde) erişilebilen bir ileti sırasına yerleştirilir.

Bu çözüm düzgün çalışıyor, ancak bitirdiğimde, bunun yerine kullanabileceğim yerleşik bir kitaplıkta zaten kararlı, performanslı ve test edilmiş bir kod olabileceğini fark ettim.

Benim sorum şu ki - böyle bir sınıfa sahip olacak bir yardımcı program kitaplığı var mı, yoksa standart Java 6 kütüphanesinde bunu zaten yapabilecek bir şey var mı?

+0

(byte) 0xFF == -1 olarak. Bir "0xff" için bayt testi başına yapabilen bir tamponlu bayt akışı çocuk sınıfı kullanılabilir. Bazı durumlarda bir boru hattı kullanılabilir: bakınız [PipedInputStream] (http://docs.oracle.com/javase/6/docs/api/java/io/PipedInputStream.html) vb. –

cevap

1

Özel çözümleyici yeterince basit olduğundan, bir çerçeveye ihtiyacınız olduğunu sanmıyorum. Bayt dizisi arama ve manipülasyon bazen Java özledim şeydir

InputStream in = new ByteArrayInputStream(new byte[]{ 
     0x00, 0x0a, (byte) 0xff, 
     0x01, 0x01, 0x01, (byte) 0xff, 
     0x01, (byte) 0xff}); 

ByteArrayOutputStream baos = new ByteArrayOutputStream(); 
for (int b; (b = in.read()) >= 0;) { 
    baos.write(b); 
    if (b == 0xff) { 
     byte[] bytes = baos.toByteArray(); 
     System.out.println(Arrays.toString(bytes)); 
     baos = new ByteArrayOutputStream(); 
    } 
} 

baskılar

[0, 10, -1] 
[1, 1, 1, -1] 
[1, -1] 
+0

Yanıt için teşekkürler. Sahip olduğumdan daha umut verici ve kesinlikle daha zarif görünüyor, ama verdiğim veriler, verdiğiniz örnekte olduğu gibi bir bayt dizisi olarak değil, ayrı bayt dizileri olarak geliyor. – Sevas

+0

Bu, byte [] 'dan nereden geliyor? Bir cihazdan mı yoksa ağdan mı okuyorsunuz? –

+0

Aslında bir seri bağlantı noktasından okunur, bu nedenle veriler bir dizi bayt dizisine benziyor – Sevas

İlgili konular