【问题标题】:Retrieving binary data in Javascript (Ajax)在 Javascript (Ajax) 中检索二进制数据
【发布时间】:2012-02-23 23:24:43
【问题描述】:

我试图让这个远程二进制文件读取字节,这些字节(当然)应该在 0..255 范围内。由于响应是作为字符串给出的,因此我需要使用 charCodeAt 来获取每个字符的数值。我遇到了 charCodeAt 返回 UTF8 中的值(如果我没记错的话)的问题,因此例如 ASCII 值 139 被转换为 8249。这弄乱了我的整个应用程序,因为我需要在发送这些值时获取它们服务器。

直接的解决方案是创建一个大开关,对于每个给定的 UTF8 代码都将返回相应的 ASCII。但我想知道是否有更优雅和更简单的解决方案。提前致谢。

【问题讨论】:

    标签: javascript ajax binary ascii utf


    【解决方案1】:

    我建议将二进制数据编码为一些独立于字符编码的格式,例如 base64

    【讨论】:

    • 这将通过从服务器端操作数据来完成,不是吗?这种方法的问题是我不控制数据的来源,因为它是一个远程的外部服务器。好吧,实际上我使用代理脚本绕过相同的来源策略,所以我想我可以在那里做到这一点。但我试图在未来避免这个原因,我想利用 CORS 机制。在这种情况下,我无法在数据到达浏览器之前对其进行触摸。
    【解决方案2】:

    以下代码摘自对此 StackOverflow question 的回答,应该可以帮助您解决问题。

    function stringToBytesFaster ( str ) { 
        var ch, st, re = [], j=0;
        for (var i = 0; i < str.length; i++ ) { 
            ch = str.charCodeAt(i);
            if(ch < 127)
            {
                re[j++] = ch & 0xFF;
            }
            else
            {
                st = [];    // clear stack
                do {
                    st.push( ch & 0xFF );  // push byte to stack
                    ch = ch >> 8;          // shift value down by 1 byte
                }
                while ( ch );
                // add stack contents to result
                // done because chars have "wrong" endianness
                st = st.reverse();
                for(var k=0;k<st.length; ++k)
                    re[j++] = st[k];
            }
        }   
        // return an array of bytes
        return re; 
    }
    
    var str = "\x8b\x00\x01\x41A\u1242B\u4123C";
    
    alert(stringToBytesFaster(str)); // 139,0,1,65,65,18,66,66,65,35,67
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-03-16
      • 1970-01-01
      • 1970-01-01
      • 2018-04-15
      • 2015-06-20
      相关资源
      最近更新 更多