Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/design-patterns/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何截断一个java整数,使其符合给定的字节数/exand?_Java_Byte_Int_Archive - Fatal编程技术网

如何截断一个java整数,使其符合给定的字节数/exand?

如何截断一个java整数,使其符合给定的字节数/exand?,java,byte,int,archive,Java,Byte,Int,Archive,我正在使用这个模板用Java设计一种存档格式(只是为了好玩)- 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 从 我很难找到文件数等的值,但我不知道如何将整数扩展为4字节

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

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

我很难找到文件数等的值,但我不知道如何将整数扩展为4字节


类似于此-

您可以将
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;
}
这将使它们按大端顺序排列,就像通常用于运输一样(请参阅)。或者,如果您已经在处理一个,您可以将它包装成一个,然后使用。例如,根据您的模板:

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);

请注意,该值实际上是8个字节。我不知道你为什么要用10,我想从
长的
中取8就足够了。

你可以将
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;
}
这将使它们按大端顺序排列,就像通常用于运输一样(请参阅)。或者,如果您已经在处理一个,您可以将它包装成一个,然后使用。例如,根据您的模板:

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);
请注意,该值实际上是8个字节。我不确定您为什么要使用10,我想从
长的
中选择8就足够了。

使用/implementation来编写/读取该格式,它可以为您完成大部分工作。经典实现包括和:

阅读的效果也差不多

请注意,这些使用。您必须检查(或指定)您的格式是否使用big-endian或little-endian。

使用/implementation来编写/读取该格式,它为您完成了大部分工作。经典实现包括和:

阅读的效果也差不多


请注意,这些使用。您必须检查(或指定)您的格式是否使用big-endian或little-endian。

在您的代码中,我认为第2行有错误。意外的int关键字?我知道在java中,字节是8位,整数是32位。这是否意味着我甚至不需要经历所有这些,只需要写整数,因为整数是4字节(32位)@Liam:是的,一个Java
int
包含4字节的数据,所以直接写它也会有同样的效果。但是,普通的
OutputStream
没有直接编写
int
的方法(不要被愚弄,请阅读其文档以了解原因)。因此,您需要其他方法来编写它:要么将它转换为
byte[]
并编写它,要么得到一个可以编写
int
值的类。无需手动转换为字节。我提供了字节示例,因为您的问题要求它:)在代码中,我认为第2行有错误。意外的int关键字?我知道在java中,字节是8位,整数是32位。这是否意味着我甚至不需要经历所有这些,只需要写整数,因为整数是4字节(32位)@Liam:是的,一个Java
int
包含4字节的数据,所以直接写它也会有同样的效果。但是,普通的
OutputStream
没有直接编写
int
的方法(不要被愚弄,请阅读其文档以了解原因)。因此,您需要其他方法来编写它:要么将它转换为
byte[]
并编写它,要么得到一个可以编写
int
值的类。无需手动转换为字节。由于您的问题,我提供了字节示例:)另一个选项是使用
ByteBuffer
。它不是那么容易使用,但是如果你想在不复制数据的情况下对某些数据段进行多次传递,这是很好的。@Daniel:没错。另一个选择是使用
ByteBuffer
。它不是那么容易使用,但是如果你想在不复制数据的情况下对某些数据段进行多次传递,这是很好的。@Daniel:没错。也有拥有的优势。