我正在从HTTP请求接收以下二进制流:

HTTP请求

Document.get({id: $scope.documentId}, function(stream){

});


角工厂

.factory('Document', ['$resource', 'DOCUMENTS_CONFIG',
    function($resource, DOCUMENTS_CONFIG) {
        return $resource(DOCUMENTS_CONFIG.DETAIL_URL, {}, {
            get: {
                method: 'GET',
                params: {},
                url: DOCUMENTS_CONFIG.DETAIL_URL,
                isArray: false
            }
        });
    }
]);


响应


console.log(流)

我需要将其转换为Uint8Array。我试图将其转换为bas64

// Convert Binary Stream To String
var dataString = JSON.stringify(stream);

// Convert to Base 64 Data
var base64Data = window.btoa(unescape(encodeURIComponent(dataString)));


运行此命令时,出现错误“格式错误的uri异常”。我也尝试过window.btoa(dataString),但是却得到“无法在“ Window”上执行“ btoa”:要编码的字符串包含Latin1范围之外的字符。”

如何将其转换为Uint8Array?

最佳答案

因此,您有一个二进制流(我假设的值是从某种字节数组(0-255)发送的)。在将其变为window.btoa(...)之前,无需执行(Uint8Array,因为它已经处于为Uint8Array准备就绪的状态)。

您只需要遍历Object's索引(存储在键的值从0开始递增的索引中)并设置Uint8Array的值,在每个索引处获取字符代码,并将该索引处的Uin8Array单元设置为该值。

您需要知道键的数量,这可以通过Object.keys(stream).length来实现。然后,我们迭代键值(i)并将charCode(0)抓取为零(因为每个键的值都是1个字符的字符串)。

var bytes = Object.keys(stream).length;
var myArr = new Uint8Array(bytes)

for(var i = 0; i < bytes; i++){
    myArr[i] = stream[i].charCodeAt(0);
}


updated your fiddle,您可以在控制台日志中记录它是如何转换的。我也将字符串截断了,因为我已经厌倦了查找所有'字符并试图对其进行转义并添加\n字符,因此它们全部都放在一行上了。

关于javascript - 二进制流到Uint8Array-JavaScript,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/28482359/

10-11 05:09