二进制流到 Uint8Array - JavaScript

Jer*_*ner 1 javascript binarystream angularjs uint8t

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

HTTP请求

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

});
Run Code Online (Sandbox Code Playgroud)

角工厂

.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
            }
        });
    }
]);
Run Code Online (Sandbox Code Playgroud)

回复

控制台.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)));  
Run Code Online (Sandbox Code Playgroud)

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

我怎样才能将其转换为 Uint8Array?

Art*_*org 5

所以你有一个二进制流(我假设这些值是从某种字节数组发送的,0-255)。在将window.btoa(...)其转换为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);
}
Run Code Online (Sandbox Code Playgroud)

更新了你的小提琴,你可以在控制台中记录它是如何转换的。我还截断了字符串,因为我厌倦了查找所有'字符并尝试转义它们并添加\n字符,以便所有字符都在一行上。