2015-12-12 3 views
-3

Есть ли какой-либо способ в java для чтения/записи целых чисел, булевых и строк из байта []?Чтение/запись с байта []

Like: 
write(50550); 
write(true); 
write("bla bla"); 

And then: 
int i = readInt(); 
int j = readBoolean(); 
String res = readUTF(); 

Walter and fge ответил на два разных способа достижения этого. Остается только вопрос: «Какой путь быстрее?»

+0

'Строка (байт [] байт, кодировка набор символов)' для преобразования из 'байт []' для 'Строка ' – Yoda

+2

@Yoda NO! Это потеряет информацию – fge

+0

@fge Он не указал цель. Да, хорошо. – Yoda

ответ

2
ByteBuffer buffer = ByteBuffer.allocate(0x1000); 
    buffer.order(ByteOrder.BIG_ENDIAN); 

    buffer.putInt(100); 
    //store booleans as 1 or 0 in a byte 
    buffer.put((byte) (true ? 1 : 0)); 
    buffer.put((byte) (false ? 1 : 0)); 

    //store string as [int length, byte array] 
    String str = "Hello World!"; 
    byte[] strBytes = str.getBytes(StandardCharsets.UTF_8); //use any charset you want here 
    buffer.putInt(strBytes.length); 
    buffer.put(strBytes); 


    buffer.flip(); 
    byte[] data = new byte[buffer.remaining()]; 
    buffer.get(data); 
    System.out.println("Total Bytes: " + data.length); 


    ByteBuffer bb = ByteBuffer.wrap(data); 

    System.out.println(bb.getInt()); 
    System.out.println(bb.get() != 0); 
    System.out.println(bb.get() != 0); 
    byte[] inStr = new byte[bb.getInt()]; 
    bb.get(inStr); 
    String myStr = new String(inStr, StandardCharsets.UTF_8); 
    System.out.println(myStr); 
+0

Примечание. : OP попросил Little Endian и UTF-16 и т. д., но я не знаю, почему вы получили голосующий голос. –

4

То, что вы ищете, это DataInputStream и DataOutputStream.

Как обернуть над resp.an InputStream и OutputStream и может читать/писать различные примитивные типы, «преобразованы в UTF» данные и т.д.

Как писать в массив байтов в себе, вы хотите использовать ByteArrayOutputStream и обертку DataOutputStream над ним:

final ByteArrayOutputStream out = new ByteArrayOutputStream(); 
final DataOutputStream dataOut = new DataOutputStream(out); 

// use dataOut; then: 

final ByteArrayInputStream in = new ByteArrayInputStream(out.toByteArray()); 
final DataInputStream dataIn = new DataInputStream(in); 

// read back 

во всяком случае, в одном из ваших комментариев также неясно, что вы хотите сделать; если это двоичные данные, то вместо этого перейдите на ByteBuffer; вы можете изменить свою консистенцию по своему желанию, прежде чем использовать ее (по умолчанию это большой конец), массивы байтов в ней и т. д. С той разницей, что в Java нет такой вещи, как неподписанные примитивные целые типы (ну, сохраните для char, но это один - своеобразный зверь).

В целом, это похоже на проблему XY, поэтому я предлагаю вам отредактировать свой вопрос и полностью объяснить, что вы пытаетесь сделать.

+0

Спасибо большое :) Вот что я искал! – Dragomirus

+0

Хорошо, но, пожалуйста, прочитайте полный вопрос. Мне кажется, что вы не все объясняли ... – fge

+0

Уолтер и фге ответили двумя разными способами, чтобы добиться этого. Остается только вопрос: «Какой путь быстрее?» – Dragomirus

0

Вы, кажется, ищете из DataInputStream и DataOutputStream.

ByteArrayOutputStream baos = new ByteArrayOutputStream(); 
DataOutputStream dos = new DataOutputStream(baos); 
// Like: 
dos.writeInt(50550); 
dos.writeBoolean(true); 
dos.writeUTF("bla bla"); 
byte[] bytes = baos.toByteArray(); 

DataInputStream dis = new DataInputStream(new ByteArrayInputStream(bytes)); 
// And then: 
int i = dis.readInt(); 
boolean flag = dis.readBoolean(); 
String res = dis.readUTF(); 

System.out.println("i: " + i + ", flag: " + flag + ", res: '" + res + "'"); 

печатает

i: 50550, flag: true, res: 'bla bla' 

stdext :: writeULE16, stdext :: writeULE32, stdext :: writeULE64 и stdext :: readULE16, stdext :: readULE32, stdext :: readULE64

Это означает, что вам нужен текстовый формат, в этом случае я предлагаю использовать PrintWriter

ByteArrayOutputStream baos = new ByteArrayOutputStream(); 
PrintWriter pw = new PrintWriter(new OutputStreamWriter(baos, "UTF-16LE")); 
// Like: 
pw.println(50550); 
pw.println(true); 
pw.println("bla bla"); 
pw.close(); 
byte[] bytes = baos.toByteArray(); 

Scanner in = new Scanner(new InputStreamReader(new ByteArrayInputStream(bytes), "UTF-16LE")); 
// And then: 
int i = in.nextInt(); 
boolean flag = in.nextBoolean(); in.nextLine(); // discard the rest of the line 
String res = in.nextLine(); 

System.out.println("i: " + i + ", flag: " + flag + ", res: '" + res + "'"); 

печатает то же самое, за исключением нижних байтов, будет в кодировке UTF-16LE. Этот подход также поддерживает UTF-16BE, UTF-32LE, UTF-32BE (и UTF-8)

Смежные вопросы