java 如何将ArrayBuffer转换为byte[]?

enxuqcxy  于 2023-02-14  发布在  Java
关注(0)|答案(2)|浏览(431)

我正在从HTMLInputElement中阅读一个文件,并想从File#arrayBuffer()中获取原始字节。我该怎么做?

import elemental2.core.ArrayBuffer;

public static byte[] toBytes(ArrayBuffer buffer) {
    // code in question
}
bksxznpy

bksxznpy1#

事实证明,只要你不太仔细地看,一个JS Int8Array(因此elemental2.core.Int8Array)的行为与GWT/Java byte[]的行为相同-它只包含-127到128之间的值。它将不能正确地转换为byte[],任何调用.getClass()或其他Java方法的东西也不能正常工作。它也不能被转换(通过泛型或显式)为byte[]
因此,如果你需要把内容当作一个真实的的Java数组,你必须先复制它,你的答案会做你想做的,但它可能是更明确的正确的不是“convert it from Double”的过程沿着:

import elemental2.core.ArrayBuffer;
import elemental2.core.Int8Array;
import jsinterop.base.Js;

public static byte[] toBytes(ArrayBuffer buffer) {
    // Use uncheckedCast since we are outright lying to the compiler
    byte[] arr = Js.uncheckedCast(new Int8Array(buffer));
    byte[] result = new byte[arr.length];
    for (int i = 0; i < arr.length; i++) {
        result[i] = arr[i];
    }
    return result;
}

您的解决方案也是正确的-GWT和J2 CL中的java.lang.Double与JSNumber类型完全相同,这是Int 8Array在查询其值时返回的值。(可能是通过value & 0xFF?)的价值,这应该是便宜的,但不是完全免费的。
最后,只要你只是把得到的byte[]当作一个可以迭代的集合,并且不会以某种方式处理它,以至于实际的类型会被检查,我们就可以完全不复制它:

import elemental2.core.ArrayBuffer;
import elemental2.core.Int8Array;
import jsinterop.base.Js;

public static byte[] toBytes(ArrayBuffer buffer) {
    byte[] result = Js.uncheckedCast(new Int8Array(buffer));
    return result;
}

虽然这确实是作弊,而且还有其他的缺点,比如如果原始缓冲区被修改,数组也会被修改,反之亦然。

kmbjn2e3

kmbjn2e32#

以下是我目前的发现:

import elemental2.core.ArrayBuffer;
import elemental2.core.Int8Array;

public static byte[] toBytes(ArrayBuffer buffer) {
    Int8Array arr = new Int8Array(buffer);
    byte[] result = new byte[arr.length];
    for (int i = 0; i < arr.length; i++) {
        Double elem = arr.getAt(i);
        result[i] = elem.byteValue();
    }
    return result;
}

相关问题