Java中的byteArray在JavaScript中的等价物

7
我正在尝试确定哪种编码方案可以为JPEG文件类型提供数字-1或-40(文件的起始数字)。
我正在使用的REST API期望一个字节数组,看起来像[-1,94,43,34等]。在Node.js中,我可以将字节数组设置为十六进制或任何其他编码类型,但无论我尝试哪种编码方案,似乎都无法获得起始值-1或-40。
在文档中,我看到了一个Java示例,它使用“toByteArray()”函数,似乎可以获得起始值(-1或-40)。有人能帮助我吗?

看到了吗?Typed Arrays?https://dev59.com/Pmct5IYBdhLWcg3wHZ9q#12332802 - Rob Audenaerde
4个回答

3
如果我正确理解您的问题,您可以使用Buffer获取文件内容,然后将字节从中读取到您的数组中。
Java中的byte类型是带符号的8位整数,在Node.js Buffer中的等效类型是buf.readInt8()
因此,您可以使用buf.readInt8()Buffer中读取所需数量的byte到您的数组中。
或者只需将其转换为Int8Array
new Int8Array(new Buffer([100, 200, 255, 1, 32]));

嗨zulmer,感谢您的回复。那么传递给Buffer对象的值应该是文件的大小,例如var buf = new Buffer(filesize)。另外,对于readInt8(offset),偏移量offset的值应该为0吗? - Raj
如果您需要获取jpeg文件内容,请使用fs模块,更具体地说是fs.readFile()fs.readFileSync。它将为您提供包含文件内容的Bufferoffset是要跳过的字节数量,例如offset=0将返回第一个字节,offset=1将返回第二个字节,依此类推。 - zlumer
完美的readInt8()函数在偏移量为0时确实会返回预期的字节,但如果要获取所有字节的值,我应该如何使用此函数?是将readInt8(0, true)设置为参数吗?我对此不太确定。 - Raj
重新表述上面的评论,我可以运行一个循环来获取所有字节值,但是否有一个函数可以直接返回所有值? - Raj

1

您还可以使用TypeArray.from()方法在所有Typed Arrays上进行转换以在普通数组之间进行转换:

const values = [-1, 94, 43, 34]

const byteArr = Int8Array.from(values)
const original = Array.from(byteArr)

console.log({ byteArr, original })

额外福利:这个可以在Node和浏览器中使用


0
我建议您更改使用魔数来识别JPEG文件的逻辑,而不是仅仅从前4个字节中获取信息,因为您的-40逻辑可能不足以准确判断。
FFD8FFE0 should be the first 4 bytes of a jpeg file

因此,以下的Node.js程序可能会有所帮助。
var fs = require('fs');
fs.open("c:\\aa1.jpg", 'r', function(err, doc){
    var check = "FFD8FFE0";
    var headerLength = ( check.length / 2 );

    var byteBuffer = new Buffer(headerLength);
    for(var i=0;i<headerLength;i++)
      byteBuffer[i] = 0x00;

    var head = "";

    fs.read(doc, byteBuffer, 0, headerLength, 0, function(err, num) {
      for(var i=0;i<headerLength;i++)
        head += byteBuffer[i].toString(16);

      if(head.toLowerCase() == check.toLowerCase())
        console.log('It is a JPEG file');
      else
        console.log('It is not a JPEG file');
    });
});

此程序未包含检查错误和文档为空的检查。

请参阅如何识别byte[]的内容是否为jpeg格式?


0
你正在寻找Buffer。它允许读取/写入各种大小的二进制值和随机访问。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接