如何截断java整数以适合/ exand到给定的字节数?

时间:2011-05-04 09:29:12

标签: java byte int archive

我正在使用此模板设计一个存档格式(只是为了好玩) -

First 4 bytes: Number of files in the archive
Next 4 bytes: Number of bytes in the filename
Next N bytes: Filename
Next 10 bytes: Number of bytes in the file
Next N bytes: File contents

来自PHP Safe way to download mutliple files and save them

我在查找文件数量等方面遇到了麻烦,但我不知道如何将整数扩展为4个字节。

是否与此类似 - How do I truncate a java string to fit in a given number of bytes, once UTF-8 encoded?

2 个答案:

答案 0 :(得分:5)

使用DataOutput / DataInput实现来编写/读取该格式,它可以完成大部分工作。经典实现是DataOutputStreamDataInputStream

DataOutputStream dos = new DataOutputStream(outputStream);
dos.writeInt(numFiles);
// for each file name
byte[] fn = fileName.getBytes("UTF-8"); // or whichever encoding you chose
dos.writeInt(fn.length);
dos.write(fn);
// ...

阅读的工作原理基本相同。

请注意,这些使用big endian。您必须检查(或指定)您的格式是使用大端还是小端。

答案 1 :(得分:3)

您可以将int转换为4个字节,如下所示:

public byte[] getBytesForInt(int value) {
    byte[] bytes = new byte[4];
    bytes[0] = (byte) ((value >> 24) & 0xFF);
    bytes[1] = (byte) ((value >> 16) & 0xFF);
    bytes[2] = (byte) ((value >> 8) & 0xFF);
    bytes[3] = (byte) (value & 0xFF);
    return bytes;
}

这将使它们像通常用于传输的大端顺序一样(参见Endianness)。或者,如果您已经处理了OutputStream,则可以使用DataOutputStream进行换行,然后使用writeInt()。例如,根据您的模板:

FileOutputStream fileOut = new FileOutputStream("foo.dat");
DataOutputStream dataOut = new DataOutputStream(fileOut);
dataOut.writeInt(numFiles);
dataOut.writeInt(numBytesInName);
dataOut.writeUTF(filename);
dataOut.writeLong(numBytesInFile);
dataOut.write(fileBytes);

请注意,writeLong()实际上是8个字节。我不确定你为什么要使用10,我认为long中的8就足够了。