2013-02-10 2 views
0

У меня есть сервер сокетов, который продолжает слушать входящие запросы. Полученные данные будут представлены в виде двоичного массива байтов. Формат данных выглядит примерно так. 2321902321221200AAАнализ двоичных данных в java, полученных через сервер сокетов TCP

  • В то время как байт данных начинают
  • бит является версия
  • бит является тип возвращаемых данных
  • байт код продукта
  • bytes длина данных

Вопрос заключается в том, как анализировать данные и отделять параметры.

Спасибо заранее!

ответ

0
try { 
    char [] cbuf = new char[16]; 
    char databegin = cbuf[0]; 
    char [] version = Arrays.copyOfRange(cbuf, 1, 6) 
    char [] product_typep = Arrays.copyOfRange(cbuf, 7, 12) 
    char []data_lendth = Arrays.copyOfRange(cbuf, 13, 15) 

} catch(Error e){ 
    System.out.println(e); 
} 
-1

Вы можете получить данные через ByteArrayOutputStream А затем разобрать байт, применяя маски (в основном AND, OR).

Посмотрите на This question

Надеются, что это помогает

+0

ByteArrayOutputStream не дает ответа на вопрос, он просто перемещает проблему. – EJP

0
byte [] data = receiveData(); 

int dataBegin = data [0];   // Once field is 1-byte, it is simple! 
int version = data [1] & 0x0F;  // Use shift (>>>) and binary "and" (&) 
int returnCode =     // to extract value of fields that are 
    (data [1] >>> 4) & 0x0F;  // smaller than one byte 
byte [] productCode =    // Copy fixed-size portions of data 
    new byte [] {     // into separate arrays using hardcode 
     data [2], data [3],   // (as here), or System.arrayCopy 
     data [4], data [5],   // in case field occupies quite 
     data [6]};     // a many bytes. 
int dataLength =     // Use shift (<<) binary or (|) to 
    (data [7] & 0xFF) |    // Combine several bytes into one integer 
    ((data [8] & 0xFF) << 8);  // We assume little-endian encoding here 
1

Try java.io.DataInputStream:

DataInputStream dis = new DataInputStream(in); 
    byte b = dis.readByte(); 
    int version = (b >> 4) & 0xF; 
    int returnType = b & 0xF; 
    byte[] productCode = new byte[5]; 
    dis.readFully(productCode); 
    int len = dis.readShort() & 0xFFFF; 
0

я получил какой-то король читателя пакет:

class Record { 

    ..... 

    Record static fromBytes(byte[] bytes) { 
     // here use ByteBuffer or DataInputStream to extract filds 
     ...... 
    } 
} 


Record readNextRecord(InputStream in) { 
    int len = in.read() && 0xFF; 
    byte[] data = new byte[len]; 
    in.read(data); 
    return Record.fromBytes(data) 
} 



{ 
    InputStream in = ....; 
    Record r readNextRecord(in); 
    process (r); 
} 

Конечно, вам нужно добавить обработку ошибок. В общем, для чего-то, что должно быть надежным, я предлагаю использовать инфраструктуру NIO, например, Grizzly или Netty.

1

если использовать java binary block parser то код будет выглядеть

class Parsed { 
    @Bin byte begin; 
    @Bin(type = BinType.BIT) int version; 
    @Bin(type = BinType.BIT) int returnType; 
    @Bin byte [] productCode; 
    @Bin(type = BinType.USHORT) int dataLength; 
} 
final Parsed parsed = JBBPParser.prepare("byte begin; bit:4 version; bit:4 returnType; byte [5] productCode; ushort dataLength;") 
     .parse(new byte[]{0x23,0x21,(byte)0x90,0x23,0x21,0x22,0x12,0x00,(byte)0xAA}) 
     .mapTo(Parsed.class); 

assertEquals(0x23, parsed.begin); 
assertEquals(0x01, parsed.version); 
assertEquals(0x02, parsed.returnType); 
assertArrayEquals(new byte[]{(byte)0x90,0x23,0x21,0x22,0x12}, parsed.productCode); 
assertEquals(0x00AA,parsed.dataLength); 
Смежные вопросы