`
yiminghe
  • 浏览: 1471353 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

xhr 二进制操作

阅读更多

XMLHttpRequest 最常用到的功能就是文本操作以及 xml 处理,但其实 xhr 还可用来对二进制进行直接操作,例如比较强悍的 linux in js .

 

 

1. responseText 方式读取

 

1.1 服务器干涉的全平台兼容

 

根据 xmlhttprequest w3 规范 ,对于返回体的处理会根据 charset 来decode 字节得到对应字符串,如果我们想要得到返回的二进制字节,就需要服务器端设置contentType text/plain ;charset 为 iso8859-1 (一个字节表示一个字符)再使用 charCodeAt(0) 来得到字符对应的字节表示。

 

服务器端:

 

public void doGet(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		response.setContentType("text/plain;charset=ios8859-1");
		byte[] b= new byte[3];
		b[0]=8;
		b[1]=4;
		b[2]=2;
		response.getOutputStream().write(b);
	}
 

客户端:

 

var req = new XMLHttpRequest();
req.open('GET', '/binary', true);
req.onreadystatechange = function (aEvt) {
    if (req.readyState == 4) {
        if (req.status == 200) {
            var content = (req.responseText);
            console.log(content.length);
            alert("第一个字节 : " + (content.charCodeAt(0) & 0xff).toString(2));
            alert("第二个字节 : " + (content.charCodeAt(1) & 0xff).toString(2));
            alert("倒数第二个字节 : " + (content.charCodeAt(content.length - 2) & 0xff).toString(2));
            alert("最后一个字节 : " + (content.charCodeAt(content.length - 1) & 0xff).toString(2));
        }

    }
};
req.send(null);

 

1.2 overrideMimeType

 

但这需要服务器端程序读取二进制文件并设置content-type为text/plain,charset 为 iso8859-1 ,常见的场景是直接由web server 返回二进制文件,这时头为 application/octet-stream ,如果按照规范,则会经过 utf-8 decode 为对应字符串,这时 charCode 是得不到对应原始二进制的,不过还好规范还支持客户端 overrideMimeType ,可以指定decode 方式,目前除了 ie 都支持

 

 

var req = new XMLHttpRequest();
req.open('GET', 'linuxstart.bin', true);
// XHR binary charset opt by Marcus Granado 2006 [http://mgran.blogspot.com]
if (req.overrideMimeType) {    
    req.overrideMimeType('text/plain; charset=iso8859-1');
}
req.onreadystatechange = function (aEvt) {
    if (req.readyState == 4) {
        if (req.status == 200) {
            var content = (req.responseText);
            console.log(content.length);
            alert("第一个字节 : " + (content.charCodeAt(0) & 0xff).toString(2));
            alert("第二个字节 : " + (content.charCodeAt(1) & 0xff).toString(2));
            alert("倒数第二个字节 : " + (content.charCodeAt(content.length - 2) & 0xff).toString(2));
            alert("最后一个字节 : " + (content.charCodeAt(content.length - 1) & 0xff).toString(2));
        }

    }
};
req.send(null);

  2.直接读取二进制流

 

 

最新的 firefox 和 chrome 则提供了直接读取二进制数据的方式,这就涉及到了两个概念:

 

ArrayBuffer :

 

代表一段内存bytes数据,但是不可读。

 

Uint8Array :

 

ArrayBuffer 的读取接口(view),表示把 ArrayBuffer 的每 8 个字节类型化为成一个整数,类似还有 Uint32Array

 

 

firefox ,chrome 会通过 xhr.response 暴漏response  ArrayBuffer 类型的原始字节,程序可通过 Uint8Array 来读取每一个字节代表的整数信息。

 

该种方式则和 charset 以及 mimeType 完全没有关系了,但是还没有形成规范 :

 

var xhr = new XMLHttpRequest();
            xhr.open("GET", "/upload/binary", false);
            xhr.responseType = "arraybuffer";
            xhr.send(null);
            // no support for w3 xhr.responseBlob
            var buffer = xhr.responseBlob || xhr.response || xhr.mozResponseArrayBuffer;
            if (buffer) {
                var byteArray = new Uint8Array(buffer);
                console.log(byteArray.byteLength);
                alert("第一个字节 : " + byteArray[0].toString(2));
                alert("第二个字节 : " + byteArray[1].toString(2));
                alert("倒数第二个字节 : " + byteArray[byteArray.byteLength - 2].toString(2));
                alert("最后一个字节 : " + byteArray[byteArray.byteLength - 1].toString(2));
            }
 

 

3. 二进制数据写入

 

关于二进制数据写入传回 server 主要用于文件上传,可见:浏览器文件操作

 

分享到:
评论

相关推荐

    JavaScript读二进制文件并用ajax传输二进制流的方法

    在JavaScript中,处理二进制文件并使用Ajax传输二进制流是一项常见的任务,尤其是在进行文件上传或数据传输时。由于浏览器之间的差异,实现这一功能需要考虑不同的API和兼容性问题。以下是一份详细的指南,涵盖了...

    Lua小程序十六进制字符串和二进制数据间的转换[借鉴].pdf

    在数据处理过程中,十六进制字符串和二进制数据之间的转换是非常常见的操作,本文将展示如何使用 Lua 实现这种转换。 一、从十六进制字符串转换为二进制数据 在 Lua 中,可以使用 string.len 函数来获取十六进制...

    C#存取二进制图片[文].pdf

    在C#中,存储和检索二进制数据,如图片,通常涉及到数据库操作,特别是当这些数据需要与数据库中的其他信息关联时。本例中,我们关注的是如何使用C#处理SQL Server数据库中的二进制图像数据。以下是关键知识点: 1....

    ieee754二进制浮点数算法[参照].pdf

    " ieee754二进制浮点数算法" ieee754二进制浮点数算法是计算机科学中一种二进制浮点数表示和运算的标准,旨在解决浮点数运算中的不兼容性和可移植性问题。该标准由 ieee(电气和电子工程师协会)于1985年发布,旨在...

    FSTREAM文本二进制方式读入写出数方法[参考].pdf

    总之,C++中的`fstream`库提供了强大的文本和二进制文件操作功能,使得在程序中处理文件变得简单易行。无论是进行数据持久化、存储用户配置,还是读取媒体文件,理解这些基本操作都是至关重要的。在实际开发中,可以...

    74197TTL二进制可预置锁存器计数器[文].pdf

    74197 TTL 二进制可预置锁存器计数器 本文档介绍了 74197 TTL 二进制可预置锁存器计数器的特点和应用。该器件是一个带有 Master Reset 输入的 ripple counter,能够实现 divide-by-two 和 divide-by-eight 计数。该...

    2进制、8进制、10进制以及16进制间的相互换算[归类].pdf

    进位制转换是计算机科学和软件开发中的基础知识,它涉及到二进制...在编程中,常使用进制转换来进行数据的表示和调试,尤其是在处理二进制数据(如位操作、网络协议解析)和内存表示时,进制转换更是不可或缺的工具。

    进制转换方法文.pdf

    - **位移运算**:在二进制操作中,位移运算是一种快速的乘除法运算。 - **进制转换表**:制作或使用进制转换表可以加快转换过程,尤其是在没有计算器辅助的情况下。 ### 5. 常见问题和注意事项 - 在手动进行进制...

    详解XMLHttpRequest(二)响应属性、二进制数据、监测上传下载进度

    在本篇文章中,我们将深入探讨XMLHttpRequest的响应属性、处理二进制数据以及如何监测上传和下载的进度。 1. 响应属性: - `responseXML`:当服务器返回的是XML格式的数据时,`responseXML`属性会返回一个DOM对象...

    进制换算题目实用.pdf

    进制转换是计算机科学中的基础概念,涉及到二进制、八进制、十进制和十六进制等不同数值系统间的转换。以下是基于题目提供的内容所涵盖的知识点: 1. **进制转换基本规则**: - 不同进制间的转换通常通过乘法和除...

    进制数之间的转换方法实用.pdf

    常见的进制包括二进制、八进制和十六进制,它们在电子计算和数据存储中扮演着重要角色。 1. **基本知识** - **十进制**:基数为10,我们日常生活中的计数系统就是十进制,它使用0-9这10个数字,每个数字的位置代表...

    C语言实全进制互转[收集].pdf

    本课程设计的目标是实现任意进制之间的转换,包括从二进制、八进制、十进制到十六进制的转换。下面将详细讨论这些转换方法。 **一、进制转换的基本原理** 1. **十进制转二进制**:采用除2取余法。将十进制数不断...

    1.2进制转换[汇编].pdf

    例如,二进制数110011.001转换为十进制数是51.125,十进制数53.6875转换为二进制数是110101.01011。此外,还存在一种万能公式法,能够帮助我们更快地进行进制转换,特别是在选择题或者需要快速得出答案的场景中非常...

    C语言位运算符[参考].pdf

    C语言的位运算符在软件开发中非常常见,特别是在底层编程和系统级程序设计中,因为它们可以直接操作二进制位,从而实现高效的数据处理。位运算符包括按位与(&)、按位或(|)、按位异或(^)、按位取反(~)以及左移()和...

    JavaScript将base64图片转换成formData并通过AJAX提交的实现方法

    base64编码是一种用64个ASCII字符表示任意二进制数据的方法,它常用于在网页中嵌入小型图片。但当需要上传图片到服务器时,通常服务器期望接收的是标准的文件格式,比如form表单中的文件输入类型(`...

    汇编语言程序设计习题答案[借鉴].pdf

    同样,十六进制数转换为二进制数和十进制数也是基本操作。例如,FAH转换为二进制是11111010,等于十进制的250。对于十六进制数转换为十进制,可以直接按权展开求和,每个数字乘以其位权重(16的幂次)。 在汇编语言...

    16进制同步加法计数器[归类].pdf

    设计一个16进制同步加法计数器意味着我们需要构建一个电路,它能够在每个时钟脉冲到来时,将当前的计数值增加1,直到达到最大值15(10001111二进制),然后回转到0(00000000二进制)。同时,该计数器还需要包含清零...

    没有XHR,Ajax精彩依旧

    尽管其名称中包含XML,但实际上,XHR可以处理多种数据格式,包括JSON、文本和二进制数据。许多JavaScript库,如jQuery,提供了简化使用的$.ajax方法,使得开发者更容易地使用XHR。 **Ajax的组成部分** 1. **基于...

    3数字编码[定义].pdf

    这些基础知识对于理解和操作计算机系统至关重要,因为计算机内部是以二进制形式处理所有信息的。了解并能够灵活运用这些数制转换技巧,有助于处理和理解计算机存储、传输和处理的信息。在实际应用中,比如编程、数据...

    汇编语言课后答案[定义].pdf

    - **十进制到二进制和十六进制**:通过除法和取余操作可以将十进制数转换为二进制数,进一步可以转换为十六进制数。例如,369转换为二进制是101110001,转换为十六进制是171H。 - **二进制到十六进制和十进制**:...

Global site tag (gtag.js) - Google Analytics