- 浏览: 1471456 次
- 性别:
- 来自: 上海
文章分类
最新评论
-
luhouxiang:
写的很不错,学习了
Extjs 模块化动态加载js实践 -
kingkongtown:
如果想改成淘宝后台那样,可以在编辑器批量上传图片呢?
kissy editor 阶段体会 -
317966578:
兄弟我最近也在整jquery和caja 开放一些接口。在git ...
caja 原理 : 前端 -
liuweihug:
Javascript引擎单线程机制及setTimeout执行原 ...
setTimeout ,xhr,event 线程问题 -
辽主临轩:
怎么能让浏览器不进入 文档模式的quirks模式,进入标准的
浏览器模式与文本模式
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 则提供了直接读取二进制数据的方式,这就涉及到了两个概念:
代表一段内存bytes数据,但是不可读。
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 主要用于文件上传,可见:浏览器文件操作
发表评论
-
continuation, cps
2013-09-12 16:49 2859起 随着 nodejs 的兴起,异步编程成为一种潮流 ... -
一种基于匹配回朔的 css3 选择器引擎实现
2013-05-07 20:40 3431一种基于匹配回朔的 css3 选择器引擎实现 介绍 C ... -
cubic-bezier 模拟实现
2013-01-05 16:34 14133cubic-bezier 曲线是 css3 动画的一个重要基石 ... -
构建前端 DSL
2012-10-11 22:10 5417目前在传统的软件开 ... -
Get cursor position and coordinates from textarea
2012-04-10 20:50 5105最近需要从 textarea 中获 ... -
兼容 ie 的 transform
2012-02-23 14:00 6465css 2d transform 是 css3 引入的一个新的 ... -
promise api 与应用场景
2012-02-07 17:34 7427promise 是 commonjs 社区中提出的异步规范,其 ... -
closure compiler 代码优化实例
2012-01-08 03:23 2859closure compiler 可以进行不少有意思的优化 ... -
write html parser
2011-12-01 02:48 2943首先需要声明 html 不能用正则表达式来直接匹配进行内容抽取 ... -
获取剪贴板数据
2011-11-07 23:31 6475兼容性: 获取剪贴板数据这块各个浏览器间存在很大的 ... -
url 映射问题
2011-11-07 21:52 3239背景 url mapping 我最早知道是作为 j ... -
tip:如何原生播放声音
2011-10-19 12:45 2991如果不想考虑浏览器间 ... -
转载:瀑布流布局浅析
2011-09-29 19:02 2887简介 如果你经 ... -
cross domain request
2011-09-29 18:39 2860场景 跨域请求是随着 ... -
基于多继承的树设计
2011-09-18 03:42 2277分类 树是一种常见 ... -
caja 原理 : 前端
2011-09-01 16:48 7113作为前端开放的基础安全保证,caja 是目前比较合 ... -
tokenization of html
2011-08-29 22:38 2802html 符号解析问题 场景: 在页面上输出包 ... -
ie 下 cloneNode 导致的属性克隆
2011-08-24 16:10 2496这个还是很值得记下,一直存在的很大隐患终于解决,由于在 ie& ... -
循环引用下的深度克隆
2011-08-04 20:39 2340深度复制和浅度复制 是当初初学 c 遇到的第一批问题,似乎使 ... -
模块的静态与动态循环依赖
2011-07-25 03:43 3297场景: 循环依赖 我是不支持的,但现实中似乎又确实需 ...
相关推荐
在JavaScript中,处理二进制文件并使用Ajax传输二进制流是一项常见的任务,尤其是在进行文件上传或数据传输时。由于浏览器之间的差异,实现这一功能需要考虑不同的API和兼容性问题。以下是一份详细的指南,涵盖了...
在数据处理过程中,十六进制字符串和二进制数据之间的转换是非常常见的操作,本文将展示如何使用 Lua 实现这种转换。 一、从十六进制字符串转换为二进制数据 在 Lua 中,可以使用 string.len 函数来获取十六进制...
在C#中,存储和检索二进制数据,如图片,通常涉及到数据库操作,特别是当这些数据需要与数据库中的其他信息关联时。本例中,我们关注的是如何使用C#处理SQL Server数据库中的二进制图像数据。以下是关键知识点: 1....
" ieee754二进制浮点数算法" ieee754二进制浮点数算法是计算机科学中一种二进制浮点数表示和运算的标准,旨在解决浮点数运算中的不兼容性和可移植性问题。该标准由 ieee(电气和电子工程师协会)于1985年发布,旨在...
总之,C++中的`fstream`库提供了强大的文本和二进制文件操作功能,使得在程序中处理文件变得简单易行。无论是进行数据持久化、存储用户配置,还是读取媒体文件,理解这些基本操作都是至关重要的。在实际开发中,可以...
74197 TTL 二进制可预置锁存器计数器 本文档介绍了 74197 TTL 二进制可预置锁存器计数器的特点和应用。该器件是一个带有 Master Reset 输入的 ripple counter,能够实现 divide-by-two 和 divide-by-eight 计数。该...
进位制转换是计算机科学和软件开发中的基础知识,它涉及到二进制...在编程中,常使用进制转换来进行数据的表示和调试,尤其是在处理二进制数据(如位操作、网络协议解析)和内存表示时,进制转换更是不可或缺的工具。
- **位移运算**:在二进制操作中,位移运算是一种快速的乘除法运算。 - **进制转换表**:制作或使用进制转换表可以加快转换过程,尤其是在没有计算器辅助的情况下。 ### 5. 常见问题和注意事项 - 在手动进行进制...
在本篇文章中,我们将深入探讨XMLHttpRequest的响应属性、处理二进制数据以及如何监测上传和下载的进度。 1. 响应属性: - `responseXML`:当服务器返回的是XML格式的数据时,`responseXML`属性会返回一个DOM对象...
进制转换是计算机科学中的基础概念,涉及到二进制、八进制、十进制和十六进制等不同数值系统间的转换。以下是基于题目提供的内容所涵盖的知识点: 1. **进制转换基本规则**: - 不同进制间的转换通常通过乘法和除...
常见的进制包括二进制、八进制和十六进制,它们在电子计算和数据存储中扮演着重要角色。 1. **基本知识** - **十进制**:基数为10,我们日常生活中的计数系统就是十进制,它使用0-9这10个数字,每个数字的位置代表...
本课程设计的目标是实现任意进制之间的转换,包括从二进制、八进制、十进制到十六进制的转换。下面将详细讨论这些转换方法。 **一、进制转换的基本原理** 1. **十进制转二进制**:采用除2取余法。将十进制数不断...
例如,二进制数110011.001转换为十进制数是51.125,十进制数53.6875转换为二进制数是110101.01011。此外,还存在一种万能公式法,能够帮助我们更快地进行进制转换,特别是在选择题或者需要快速得出答案的场景中非常...
C语言的位运算符在软件开发中非常常见,特别是在底层编程和系统级程序设计中,因为它们可以直接操作二进制位,从而实现高效的数据处理。位运算符包括按位与(&)、按位或(|)、按位异或(^)、按位取反(~)以及左移()和...
base64编码是一种用64个ASCII字符表示任意二进制数据的方法,它常用于在网页中嵌入小型图片。但当需要上传图片到服务器时,通常服务器期望接收的是标准的文件格式,比如form表单中的文件输入类型(`...
同样,十六进制数转换为二进制数和十进制数也是基本操作。例如,FAH转换为二进制是11111010,等于十进制的250。对于十六进制数转换为十进制,可以直接按权展开求和,每个数字乘以其位权重(16的幂次)。 在汇编语言...
设计一个16进制同步加法计数器意味着我们需要构建一个电路,它能够在每个时钟脉冲到来时,将当前的计数值增加1,直到达到最大值15(10001111二进制),然后回转到0(00000000二进制)。同时,该计数器还需要包含清零...
尽管其名称中包含XML,但实际上,XHR可以处理多种数据格式,包括JSON、文本和二进制数据。许多JavaScript库,如jQuery,提供了简化使用的$.ajax方法,使得开发者更容易地使用XHR。 **Ajax的组成部分** 1. **基于...
这些基础知识对于理解和操作计算机系统至关重要,因为计算机内部是以二进制形式处理所有信息的。了解并能够灵活运用这些数制转换技巧,有助于处理和理解计算机存储、传输和处理的信息。在实际应用中,比如编程、数据...
- **十进制到二进制和十六进制**:通过除法和取余操作可以将十进制数转换为二进制数,进一步可以转换为十六进制数。例如,369转换为二进制是101110001,转换为十六进制是171H。 - **二进制到十六进制和十进制**:...