在Javascript中将非Unicode二进制字符串转换为字节数组

时间:2018-08-08 01:16:18

标签: javascript string binary non-unicode

我使用Ajax从Web服务器读取了一个二进制文件。 HTTP响应具有contentType:“ application / octet-stream”,并且包含一个二进制字符串,该二进制字符串只是一个字节字符串(不是unicode),例如(十六进制):

0x00 0x08 0x17 0xA1 0x01

注意:在C语言中,这将表示为内存中的5个字节:

char buf[5] = {0, 8, 23, 161, 1}

...但是在Javascript中,这是一个字符串,其ASCII表示形式类似于“”。(由于并非所有字符都具有可打印的表示形式,因此我无法正确粘贴它。)

我现在需要将其转换为字符或整数数组,以便可以访问字符串中每个字符的数值。但是,使用charCodeAt()函数遍历示例字符串将返回:

[0] 0
[1] 8
[2] 23
[3] 65533
[4] 1

因为charCodeAt()解码Unicode字符,并且0xA1无法识别为有效的Unicode字符,所以改用Replacement Character(65533)。

我想得到以下信息:

[0] 0
[1] 8
[2] 23
[3] 161
[4] 1

如何实现?

这是代码段:

$.ajax({
url: url,
type: "get",
success: function(data) { // data contains binary representation of 0x00 0x08 0x17 0xA1 0x01
    var byteTab = []
    for (var n = 0; n < data.length; ++n) {
        byteTab.push(data.charCodeAt(n))
    }
})

2 个答案:

答案 0 :(得分:1)

更新:在这种情况下,我不确定[默认] Ajax是否适合该作业。无论文件大小如何,通常最好使用流来适应将来的可伸缩性,因为您的当前方法会立即加载所有内容。

This article讨论了如何创建自定义ajax传输,该传输包装了XmlHttpRequest来将数据加载到数组缓冲区中。您可以执行此操作,依次将字节推入主数组,然后从那里移出。

: 我不确定我是否能正确理解您的数据表示形式,但是我相信您可以使用parseInt()将十六进制字符串转换为十进制:

var data = ['0x00', '0x08', '0x17', '0xA1', '0x01'];
var parsed = [];

for(var i = 0; i < data.length; i++) {
	parsed.push(parseInt(data[i], 16));
}

console.log(parsed);
console.log(parseInt('0xA1', 16))

如果这不是您的意思,请发表评论,我将尝试通过更具体的实施方式来更新我的答案。

答案 1 :(得分:0)

suggestion的回答Haus 之后,我找到了解决该问题的更多方法,因此我将在这里分享我的发现。

  1. 我的首选解决方案是使用ArrayBuffer访问原始数据。不幸的是,尽管有一个添加this article的选项(我无法使用),但Ajax似乎不支持support,但没有一种直接的方法可以创建ArrayBuffer。串。但是XMLHttpRequest支持ArrayBuffer作为here所述的responseType,因此我将代码更改为以下代码,它实现了我想要的功能:

    var xhr = new XMLHttpRequest();
    xhr.open('GET', url);
    xhr.responseType = 'arraybuffer';  
    xhr.onload = function() {
        if (this.status == 200) {
            var byteTab=[]
            var uint8View = new Uint8Array(this.response)
            for (var n = 0; n < uint8View.byteLength; n++) {
                byteTab.push(uint8View[n])
            }
    
        } 
    };
    xhr.send();
    
  2. 另一种解决方案是使用Blob来访问ArrayBuffer,此answer

  3. 中的示例对此进行了说明。
  4. 另一种选择是按照示例here的方式将Blob与FileReader.readAsBinaryString()结合使用。使用readAsBinaryString()将blob转换为unicode字符串,然后可以使用charCodeAt()对其进行解析