【问题标题】:Binary Stream To Uint8Array - JavaScript二进制流到 Uint8Array - JavaScript
【发布时间】:2015-02-12 16:14:30
【问题描述】:

我从 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?

【问题讨论】:

  • 我根据您提供的知识修改了下面的答案。您是否也可以共享用于发出请求的代码?是 AJAX 吗?该 AJAX 调用的预期返回类型是什么?
  • 是的 - 将分享。这是一个 Angular HTTP 请求。
  • HTTP 请求已添加
  • 啊,我对 Angular 不太熟悉(而且 10 分钟的搜索很难找到确切返回的具体文档),我确实修改了下面的答案以说明Javascript 对象(打印到控制台的内容)而不是字符串。

标签: javascript angularjs uint8t binarystream


【解决方案1】:

所以你有一个二进制流(我假设的值是从某种字节数组发送的,0-255)。在将其转换为 Uint8Array 之前,您无需执行(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);
}

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

【讨论】:

  • 当我尝试获取代码中所示的 base64Data 时,我收到错误“格式错误的 uri 异常”,所以如果我可以获得 base 64 数据,我可以使用此代码,但我目前不甚至有那个
  • 如果上述方法不起作用,您有机会发布原始流字符串吗? (而不是图像)
  • 是的 - 这是原始响应。我把它放在一个 jsfiddle 中只是因为它大约有 500 行。 jsfiddle.net/Lu5sgae8
  • 太棒了——当我只记录我的“流”变量时,虽然它记录为一个对象,而不是一个字符串,这就是我使用 stringify 的原因
  • 我进行了修改以使用Javascript Object 而不是String,我认为我的回答可以解决问题。但是,角度特定的答案可能会更好。因此,如果我的答案确实有效,我仍然会等着看 retag 是否能抓住有更多 angularjs 经验的人来给出 angularjs 特定的答案(在认可解决方案之前)。
猜你喜欢
  • 1970-01-01
  • 2016-02-11
  • 2017-09-15
  • 2018-01-12
  • 2022-07-21
  • 2017-02-04
  • 1970-01-01
  • 2022-01-09
  • 2012-06-11
相关资源
最近更新 更多