我从 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
}
});
}
]);
回应
控制台日志(流) 我需要将其转换为 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)。在将其转换为 Uint8Array
之前,您无需执行(window.btoa(...)
,因为它已经处于为 Uint8Array 准备就绪的状态)。
您只需要遍历Object 的
索引(存储在从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 ,您可以在控制台中记录它是如何转换的。我还 chop 了字符串,因为我厌倦了查找所有 '
字符并尝试将它们转义并添加 \n
字符以便它们都在一行上。
关于javascript - 二进制流到 Uint8Array - JavaScript,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28482359/