二进制流到Uint8Array - JavaScript

时间:2015-02-12 16:14:31

标签: javascript angularjs uint8t binarystream

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

HTTP请求

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

});

Angular Factory

.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),但是我得到了'无法执行' btoa' on' Window':要编码的字符串包含Latin1范围之外的字符。'

如何将其转换为Uint8Array?

1 个答案:

答案 0 :(得分:2)

所以你有一个二进制流(我假设的值是从某种字节数组发送的,0-255)。在将window.btoa(...)转换为Uint8Array之前,您无需执行(Object's,因为它已处于为Uint8Array准备好的状态)。

您只需要遍历Object.keys(stream).length索引(存储在键的值从0开始增加)并设置Uint8Array的值,抓取每个索引处的字符代码,并将Uin8Array单元设置为该值的索引。

您需要知道密钥的数量,这可以通过i实现。然后,我们迭代我们的键值(charCode(0))并将var bytes = Object.keys(stream).length; var myArr = new Uint8Array(bytes) for(var i = 0; i < bytes; i++){ myArr[i] = stream[i].charCodeAt(0); } 置于零(因为每个键的值是1个字符的字符串)。

'

updated your fiddle,您可以在控制台中记录它的转换方式。我也截断了字符串,因为我厌倦了找到所有\n字符并试图逃避它们并添加{{1}}个字符,所以它们都在一行上。