如果我在JavaScript中有一个Uint8Array数组,我将如何获取最后四个字节,然后将其转换为int?使用C#我会做这样的事情:

int count = BitConverter.ToInt32(array, array.Length - 4);

是否有使用JavaScript的等效方法?

最佳答案

访问底层的ArrayBuffer并使用其一部分字节创建一个新的TypedArray:

var u8 = new Uint8Array([1,2,3,4,5,6]); // original array
var u32bytes = u8.buffer.slice(-4); // last four bytes as a new `ArrayBuffer`
var uint = new Uint32Array(u32bytes)[0];

如果TypedArray不能覆盖整个缓冲区,则需要增加一些技巧,但不要太多:
var startbyte = u8.byteOffset + u8.byteLength - Uint32Array.BYTES_PER_ELEMENT;
var u32bytes = u8.buffer.slice(startbyte, startbyte + Uint32Array.BYTES_PER_ELEMENT);

这在两种情况下均有效。

如果您想要的字节适合数据类型的基础缓冲区的对齐边界(例如,您想要基础缓冲区的字节4-8的32位值),则可以避免使用slice()复制字节,而只需提供一个像@Bergi的答案一样,将字节偏移量设置为 View 构造函数。

下面是一个经过非常轻松测试的函数,该函数应该获取您想要的任何偏移量的标量值。如果可能,它将避免复制。
function InvalidArgument(msg) {
    this.message = msg | null;
}

function scalarValue(buf_or_view, byteOffset, type) {
    var buffer, bufslice, view, sliceLength = type.BYTES_PER_ELEMENT;
    if (buf_or_view instanceof ArrayBuffer) {
        buffer = buf_or_view;
        if (byteOffset < 0) {
            byteOffset = buffer.byteLength - byteOffset;
        }
    } else if (buf_or_view.buffer instanceof ArrayBuffer) {
        view = buf_or_view;
        buffer = view.buffer;
        if (byteOffset < 0) {
            byteOffset = view.byteOffset + view.byteLength + byteOffset;
        } else {
            byteOffset = view.byteOffset + byteOffset;
        }
        return scalarValue(buffer, view.byteOffset + byteOffset, type);
    } else {
        throw new InvalidArgument('buf_or_view must be ArrayBuffer or have a .buffer property');
    }
    // assert buffer instanceof ArrayBuffer
    // assert byteOffset > 0
    // assert byteOffset relative to entire buffer
    try {
        // try in-place first
        // only works if byteOffset % slicelength === 0
        return (new type(buffer, byteOffset, 1))[0]
    } catch (e) {
        // if this doesn't work, we need to copy the bytes (slice them out)
        bufslice = buffer.slice(byteOffset, byteOffset + sliceLength);
        return (new type(bufslice, 0, 1))[0]
    }
}

您可以这样使用它:
// positive or negative byte offset
// relative to beginning or end *of a view*
100992003 === scalarValueAs(u8, -4, Uint32Array)
// positive or negative byte offset
// relative to the beginning or end *of a buffer*
100992003 === scalarValue(u8.buffer, -4, Uint32Array)

关于javascript - 如何将数组中的最后4个字节转换为整数?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/14963182/

10-12 12:29
查看更多