gpt4 book ai didi

java - 使用 Inputstream 将二进制数据转换为 long[],同时保持原始顺序

转载 作者:行者123 更新时间:2023-12-01 22:19:43 28 4
gpt4 key购买 nike

问题描述

我有一个 2mb 的文件,其中仅包含二进制数据。我只需将此文件转换为 long[],同时保持该文件中数据的顺序。由于该文件是在 Android 上读取的,因此我只能以 InputStream 的形式访问该文件。我拼命想要完成的最后一件事(也是我将数据放入压缩二进制数据格式的原因)是尽快完成。

Android 的工作代码

由于我无法在 Android 上获取 File 并且只能使用 resource 并将文件表示为 InputStream,因此我必须为桌面编写才能使用输入流而不是文件。在我的旗舰手机上,使用以下代码平均花费 61 毫秒:

DataInputStream dis = new DataInputStream(context.getResources().openRawResource(fileID));
int bytesOfBinaryFile = dis.available();
byte[] bytes = new byte[bytesOfBinaryFile];
dis.readFully(bytes);
int longCount = bytesOfBinaryFile / 8;
long[] array = new long[longCount];
bytesToLongArray(bytes, array);

其中 bytesToLongArray(bytes, array) 为:

private void bytesToLongArray(byte[] bytes, long[] longs) {
int numberOfLongs = longs.length;
int head = 0;
long l;
for (int i = 0; i < numberOfLongs; i++) {
l = ((bytes[head] & 0xFFL) << 56) |
((bytes[head + 1] & 0xFFL) << 48) |
((bytes[head + 2] & 0xFFL) << 40) |
((bytes[head + 3] & 0xFFL) << 32) |
((bytes[head + 4] & 0xFFL) << 24) |
((bytes[head + 5] & 0xFFL) << 16) |
((bytes[head + 6] & 0xFFL) << 8) |
((bytes[head + 7] & 0xFFL) << 0) ;
longs[i] = l;
head += 8;
}
}

类似的桌面工作代码

仅供引用和比较,我包含此代码。我让它在我的桌面上运行得非常快(只需要大约 3.5 毫秒)将 2mb 文件加载到 long[] 中:

String fileName = "example";
FileInputStream fip = new FileInputStream(fileName);
FileChannel fc = fip.getChannel();
double bytesOfBinaryFile = fc.size();
int longCount = (int) bytesOfBinaryFile / 8;
MappedByteBuffer mbb = fc.map(FileChannel.MapMode.READ_ONLY,
0L, fc.size());
LongBuffer lb = mbb.asLongBuffer();
long[] array = long[longCount];
lb.get(array);

问题

我想知道是否有人知道更快的方法或改进我当前方法的方法。我希望性能仍有改进的空间。

最佳答案

这可能就是您正在寻找的:

 ByteBuffer byteBuffer = ByteBuffer.wrap (byte[] array);
LongBuffer longBuffer = byteBuffer.asLongBuffer ()
long[] longArray = longBuffer.array();

http://developer.android.com/reference/java/nio/ByteBuffer.html#asLongBuffer%28%29

关于java - 使用 Inputstream 将二进制数据转换为 long[],同时保持原始顺序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30150991/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com