2013-11-20 4 views
0

привет, я новичок в манипуляции байтами в java. я уже имею массив байтов с текущим форматомЭкстракты байтов В указанном месте из массива байтов

1-> datapacketlength (length of name) (first byte) 
2-> name (second byte + datapacket length) 
3-> datapacketlength (length of datetime) 
4-> current date and time 

Как я могу извлечь имя и текущую дату и время. should i use Arrays.copyOfRange() method.

Привет от

мкд

+0

Как долго длинные поля? Получено ли это из сокета или локально читается из файла? – stacker

+0

Поле длины содержит один байт, и оно будет меняться. – mcd

ответ

1

Вы можете использовать ByteBuffer и использовать свой текущий массив байтов, а затем использовать методы, которые приходят с ней, чтобы получить следующий float, int и т. д. (например, buffer.getInt и buffer.getFloat).

Вы можете получить часть своего байтового массива при создании нового байтового буфера с помощью метода wrap, который я считаю. Возможности безграничны :). Для того, чтобы получить строки, как вы просили, вам просто нужно сделать что-то вроде:

byte[] name = new byte[nameLength]; 
buffer.get(name); 
nameString = byteRangeToString(name); 

где byteRangeToString способ вернуть новый строковое представление байт [] данных, передать его.

public String byteRangeToString(byte[] data) 
{ 
    try 
    { 
     return new String(data, "UTF-8"); 
    } 
    catch (UnsupportedEncodingException e) 
    { 
     /* handle accordingly */ 
    } 
} 

См: http://developer.android.com/reference/java/nio/ByteBuffer.html

Использование copyOfRange() может запустить вас в памяти вопросы, если они используются чрезмерно.

+0

это работает спасибо – mcd

0

Что о чем-то вроде:

int nameLength = 0; 
int dateLength = 0; 
byte[] nameByteArray; 
byte[] dateByteArray 

for(int i=0; i<bytesArray.length; i++){ 
    if(i == 0){ 
     nameLength = bytesArray[i] & 0xFF; 
     nameByteArray = new byte[nameLength]; 
    } 
    else if(i == nameLength+1){ 
     dateLength = byteArray[i] & 0xFF; 
     dateByteArray = new byte[dateLength]; 
    } 
    else if(i < nameLength+1){ 
     nameByteArray[i-1] = bytesArray[i]; 
    } 
    else{ 
     dateByteArray[i-(nameLength+1)] = bytesArray[i]; 
    } 
} 
Смежные вопросы