【问题标题】:Java byteArray equivalent in JavaScriptJavaScript 中等效的 Java byteArray
【发布时间】:2015-08-28 03:45:04
【问题描述】:

我正在尝试确定哪种编码方案将为我提供 jpeg 文件类型的数字 -1 或 -40(文件的起始数字)。

我正在研究的一个休息 api 需要一个看起来像 [-1、94、43、34 等] 的字节数组。在 node.js 中,我可以将字节数组设置为十六进制或任何其他编码类型,但无论我尝试哪种编码方案,我似乎都无法获得 -1 或 -40 的起始值。

在文档中,我看到了一个使用“toByteArray()”函数的 Java 示例,该函数似乎获取了起始值(-1 或 -40)。谁能帮帮我?

【问题讨论】:

标签: java javascript node.js byte bytearray


【解决方案1】:

如果我正确理解您的问题,您可以使用Buffer 获取文件内容,然后将其中的字节读取到您的数组中。

Java byte 类型是有符号的 8 位整数,在 Node.js Buffer 中等价于 buf.readInt8()

因此,您可以使用 buf.readInt8() 将所需数量的 bytes 从 Buffer 读取到您的数组中

或者直接转换成Int8Array:

new Int8Array(new Buffer([100, 200, 255, 1, 32]));

【讨论】:

  • 您好 zulmer thnxs 对于响应,因此传递给 Buffer 对象的值将是文件的大小 var buf = new Buffer(filesize)。同样对于 readInt8(offset),偏移值应该是 0?
  • 如果您需要获取 jpeg 文件内容,请使用fs 模块,更具体地说是fs.readFile()fs.readFileSync。它将为您提供带有文件内容的Bufferoffset 是要跳过的字节数,例如offset=0 将返回第一个字节,offset=1 将返回第二个字节,以此类推
  • 完美的 readInt8() 确实在偏移量设置为 0 时给出了预期的字节,我如何使用这个函数获取所有字节值我只是设置 readInt8(0, true),对此不确定
  • 改写上面的评论,我可以运行一个循环来获取所有字节值,但是是否有一个函数只返回所有值
【解决方案2】:

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

【讨论】:

    【解决方案3】:

    我建议您更改使用前 4 个字节的幻数识别 JPEG 文件的逻辑,您的 -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');
        });
    });
    

    此程序不包括检查错误和文档空值检查

    参考How to identify contents of a byte[] is a jpeg?

    【讨论】:

      【解决方案4】:

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

      const values = [-1, 94, 43, 34]
      
      const byteArr = Int8Array.from(values)
      const original = Array.from(byteArr)
      
      console.log({ byteArr, original })

      奖励:这适用于节点以及浏览器

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2018-02-06
        • 1970-01-01
        • 2010-11-29
        • 2012-01-21
        • 2014-05-16
        • 2021-05-28
        • 2011-06-23
        • 1970-01-01
        相关资源
        最近更新 更多