在 Javascript (Ajax) 中检索二进制数据

发布于 2025-01-01 22:30:15 字数 274 浏览 3 评论 0原文

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

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

Im trying to get this remote binary file to read the bytes, which (of course) are supossed to come in the range 0..255. Since the response is given as a string, I need to use charCodeAt to get the numeric values for every character. I have come across the problem that charCodeAt returns the value in UTF8 (if im not mistaken), so for example the ASCII value 139 gets converted to 8249. This messes up my whole application cause I need to get those value as they are sent from the server.

The immediate solution is to create a big switch that, for every given UTF8 code will return the corresponding ASCII. But i was wondering if there is a more elegant and simpler solution. Thanks in advance.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

探春 2025-01-08 22:30:15

以下代码是从这个StackOverflow问题的答案中提取的,应该可以帮助您解决问题。

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

The following code has been extracted from an answer to this StackOverflow question and should help you work around your issue.

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
芸娘子的小脾气 2025-01-08 22:30:15

我建议对二进制数据进行编码是一些与字符编码无关的格式,例如base64

I would recommend encoding the binary data is some character-encoding independent format like base64

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文