2012-02-01 28 views
0

我试图让这个远程二进制文件读取字节,当然这个字节会被置于范围0..255之内。由于响应是以字符串形式给出的,我需要使用charCodeAt来获取每个字符的数值。我碰到过这个问题,即charCodeAt以UTF8的形式返回值(如果我没有弄错),所以例如ASCII值139会被转换为8249.这会弄乱我的整个应用程序,因为我需要从它们发送时获取这些值服务器。在Javascript(Ajax)中检索二进制数据

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

回答

1

一些字符编码无关的格式下面的代码已经从一个答案提取到这个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 
1

我建议编码的二进制数据是像的base64

+0

这将通过操纵数据从服务器端来完成,不是吗?这种方法的问题是我不控制数据的来源,因为它是一个远程的外部服务器。那么,实际上即时通过使用代理脚本绕过相同的原产地政策,所以我想我可以那样做。但即时通讯设法避免这个原因,我想利用CORS机制。在这种情况下,我不能在数据到达浏览器之前触摸数据。 – 2012-02-01 09:17:40