JS处理二进制数据

缘起

JS如何按字节来读取二进制数据?比如: 对于二进制字符串str,如何逐个字节地转换成16进制标识的编码?

 

分析

JS中常用的字符串函数:

String.fromCharCode(code, code,…)

String.prototype.charCodeAt(int)

String.prototype.charAt(int)

 

通过查阅ecma文档: http://www.ecma-international.org/publications/files/ECMA-ST/Ecma-262.pdf 可知:

String.fromCharCode(0x61) 得到的是一个ascii 字符 ‘a’ ,但是千万不要以为这是一个单字节的,不管参数char code有多大或者有多小,得到的都是一个双字节的char。如果参数>=2^16 ,则实际按照模2^16来处理。

下面给出一个将二进制信息转换成16进制编码的小函数:

 

 

 

问题: 如果二进制数据是奇数个字节怎么办呢?

 

如果需要JS操作,则:

1. 将数据转换成ucs-2编码,然后做进一步的其它编码

2. JS从其它编码解得ucs-2编码后,在通过utf16to8(…)转换成utf8编码

 

结论

JS按字节操作二进制数据时,不要用字符串来做,要用字节数组来做(就是把字节code存放到数组里)。

一般来讲,JS能接收到的数据是非二进制的,或者说是对二进制数据做了16进制编码或base64编码(或其它编码),JS对编码的数据做解码时,解得的字节不要用String.fromCharCode(..)来处理直接存放为字符串,而是把解得的字节code放到一个数组里面,然后进行一系列的处理,最终处理后的数据可能还是二进制的,那么就把这些字节code从数组中直接做16进制或base64编码,然后输出。

 

关于网上的uf16to8(…)的函数: http://www.onicos.com/staff/iz/amuse/javascript/expert/utf.txt

我觉得这只是一个概念上的逻辑,这样写并不能达到想要的效果。

首先,使用String.fromCharCode(…)来返回一个字节不对的,因为该函数返回的一定是2字节的,即使一个ascii字符; 另:该函数认为charCodeAt(…)取到的是一个字节的code,也是错误的,因为该函数总是按2字节取的。

或者,可以这样理解,这几个函数都是操作字符串对象的,而在JS中,字符串总是按照UCS-2来存储的,这些函数的输入和输出也都是UCS-2编码的

 

关于escape的编码问题:

escape

escape2

 

JS 规范及实现(V8)

缘起

JS的escape到底是怎么实现的?如:

 

哪些字符不做编码?哪些字符做 ‘%’ 编码?哪些字符做 ‘%u’ 编码?

 

参考资料:

Ecma: http://www.ecma-international.org/publications/standards/Ecma-262.htm

 

Google V8项目主页: https://code.google.com/p/v8/

Google V8源码下载: https://code.google.com/p/v8/wiki/Source  参看:uri.h中 URIEscape::Escape 的实现

Google V8开发者参考: https://developers.google.com/v8/build

 

关于JS做压缩:

http://www.poluoluo.com/jzxy/201004/83108.html

lz77

 

JS二进制操作: http://blog.chinaunix.net/uid-52437-id-3325514.html

chrome extension 如何保存图片到本地

摘自: http://segmentfault.com/q/1010000000202581

 

分享Chrome Extension(扩展程序/插件)开发的一些小经验

转自: http://www.cnblogs.com/dudu/archive/2012/11/22/chrome_extension.html

1、不通过Chrome Web Store直接安装Chrome插件(Extension)

我们之前开发网摘Chrome插件时,不需要通过Chrome Web Store,直接在网站上提供网摘插件的链接,用户点击就可以安装。后来,Chrome改为必须通过Web Store才能安装插件。

我们找到了一个Hack的方法,在Chrome Extensions窗口,直接将下载至本地的网摘插件文件拖动到Extensions窗口即可。

2、引用外部javascript文件的问题

如果在Extenstion中引用了外部的js文件,会引发这样的错误:

解决方法:在manifest.json中添加如下的代码(假设我们这里引用的是ajax.googleapis.com的js):

3、不支持inline javascript代码的问题

从Chrome Extenstion V2开始,不允许执行任何inline javascript代码(也就是html内的任何js代码都不允许执行),比如下面的代码:

onclick中的addwz()函数不允许执行,点击时会报错:

解决方法:在内部引用的js文件中绑定事件,示例代码如下:


 

去掉IE10文本框后面的XX

参考:http://www.unicac.cn/share/ms-clear.html

ie10浏览器当点击文本框的时候,默认值文本框的里面靠后的地方出现一个删除的X,有时候很实用,但有时候却很烦恼,怎么去掉呢?

简单的去掉IE10文本框后面的XX的方法:给Input文本框添加如下CSS

提示:input后面是两个冒号哦!伪元素需要有两个冒号。具体可以看 这篇文章

关于论坛

今天了解了几个开源的论坛: phpBB、MyBB、smf,简单写一下心得

这三个论坛在sae上都有修改后的,可以直接安装

mybb不是完全面向对象的实现,代码结构不太好看;

smf的代码更是完全的面向过程的写法,尤其把函数都放到一个数组里面,通过数组的方式来使用,是非常的不编辑器友好的;

mybb和smf都是国外的开源软件,都在持续的维护着呢。

mybb和phpbb都可以安装插件之后通过tabatalk这个手机app来访问,参看: http://tapatalk.com  但是,目前只有iphone上有这个app,而且这个app还是收费的。

mybb可以通过插件: http://www.mybbgm.com/download.php 实现手机友好的访问

 

PHP Soap 生成WSDL

缘起:

1. 开发一个http的webservice,接口定义是比较费时的,使用现成的webservice还是比较不错的

2. 常用的webservice有Soap和RPC,Soap是业界的标准,而RPC则比较轻量级

3. 使用Soap时,如果手动来写wsdl文件是非常糟糕的事情,下面提供自动生成wsdl的方法

4. 使用Soap时,编辑器很难提示类有什么方法,如果给编辑器一个soap的插件帮助提示,便是极好的,有没有呢?

 

一些参考资料:

http://stackoverflow.com/questions/12490298/perfect-soap-wsdl-web-service-in-php

 

一个可以生成wsdl的PHP类,参考资料: http://www.cnblogs.com/phpdragon/archive/2012/06/10/2544171.html