如果我在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/