我正在从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/