php处理二进制,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进制编码的小函数:

function bin2hex(str) {

var result = "";

for (i = 0; i < str.length; i++ ) {

var c = str.charCodeAt(i);

result += byte2Hex(c>>8 & 0xff); // 高字节

result += byte2Hex(c & 0xff);// 低字节

}

return result;

}

function byte2Hex(b) {

if(b < 0x10)

return "0" + b.toString(16);

else

return b.toString(16);

}

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

functionbin2hex(str){

varresult="";

for(i=0;i

varc=str.charCodeAt(i);

result+=byte2Hex(c>>8& 0xff);// 高字节

result+=byte2Hex(c& 0xff);// 低字节

}

returnresult;

}

functionbyte2Hex(b){

if(b<0x10)

return"0"+b.toString(16);

else

returnb.toString(16);

}

function bin2hex(str) {

var result = "";

for (i = 0; i < str.length; i++ ) {

result += int16_to_hex(str.charCodeAt(i));

}

return result;

}

function int16_to_hex(i) {

var result = i.toString(16);

var j = 0;

while (j+result.length < 4){

result = "0" + result;

j++;

}

return result;

}

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

functionbin2hex(str){

varresult="";

for(i=0;i

result+=int16_to_hex(str.charCodeAt(i));

}

returnresult;

}

functionint16_to_hex(i){

varresult=i.toString(16);

varj=0;

while(j+result.length<4){

result="0"+result;

j++;

}

returnresult;

}

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

如果需要JS操作,则:

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

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

结论

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

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

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

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

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

关于escape的编码问题:

d8386c72ef18edc6a3e7918da6babb35.png

6c471741de43f84ab9b2f2719c61cd3e.png

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值