二进制流到 Uint8Array - JavaScript

Binary Stream To Uint8Array - JavaScript

我从 HTTP 请求中收到以下二进制流:

HTTP 请求

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

});

Angular工厂

.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)));  

当我 运行 这样做时,我得到一个错误 'malformed uri exception'。我也试过 window.btoa(dataString) 但我得到“无法在 'Window' 上执行 'btoa':要编码的字符串包含 Latin1 范围之外的字符。”

如何将其转换为 Uint8Array?

所以你有一个二进制流(我假设的值是从某种字节数组发送的,0-255)。在将它变成 Uint8Array.

之前,您不需要执行(window.btoa(...) 因为它已经处于为 Uint8Array 准备好的状态)

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

您需要知道 Key 的数量,这可以通过 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 个字符,因此它们都在一行上。