我从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?
答案 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}}个字符,所以它们都在一行上。