在客户端javascript脚本代码中,对于二进制数据并没有提供一个很好的支持。然后在nodejs中需要处理像TCP流或文件流时,必须要处理二进制数据。因此在node.js中,定义了一个Buffer类,该类用来创建一个专门存放二进制数据的缓存区。
在Node.js中,Buffer类是一个可以在任何模块中被利用的全局类,不需要为该类的使用而加载任何模块.我们可以使用new关键字来创建该类的实例对象.Buffer类拥有三种形式的构造函数.
nodejs存取2进制数据的方法如下:
1、只需要将缓冲区大小(以字节为单位)指定为构造函数的参数.
new Buffer(size)
被创建的Buffer对象拥有一个length属性,属性值为缓冲区的大小.
打开终端输入一些命令来创建Buffer对象并查看缓冲区的大小,输入命令可以看到结果.
dingweijun@dingweijun-ThinkPad-Edge-E430c:~$ node
> buf = new Buffer(100);
<Buffer b8 ee 3e 8b 0a 7f 00 00 c0 a5 cb 01 00 00 00 00 c0 a5 cb 01 00 00 00 00 0a 00
00 00 00 00 00 00 48 a6 cb 01 00 00 00 00 05 00 00 00 00 00 00 00 00 00 00 ...>
>
2、构造函数可以直接使用一个数组来初始化缓冲区.
new Buffer(array)
在这种形式构造函数中,他使用一个存放了需要被指定数值的数组来作为构造函数的参数.
打开终端输入一些命令以使用数组创建Buffer对象.
dingweijun@dingweijun-ThinkPad-Edge-E430c:~$ node
> buf = new Buffer([0,1,2]);
<Buffer 00 01 02>
>
3、构造函数是直接使用一个字符串来初始化缓冲区.
new Buffer(str,[encoding])
在这种形式的构造函数中,使用两个参数,其中第一个参数是必须要指定的参数,参数值为用于初始化缓冲区的字符串,第二个参数为一个用于指定文字编码格式的字符串,默认值为"utf-8".
打开终端输入一些命令以使用字符串参数创建Buffer对象.
dingweijun@dingweijun-ThinkPad-Edge-E430c:~$ node
> buf = new Buffer('我喜欢编程')
<Buffer e6 88 91 e5 96 9c e6 ac a2 e7 bc 96 e7 a8 8b>
>
字符串的长度与缓冲区的长度
在Node.js中,一个字符串的长度与根据该字符串所创建的缓冲区的长度并不相同,因为计算字符串的长度时,以字节作为一个单位,而在计算缓冲区的长度时,以字节数作为一个单位.
我们来做个实例,针对"我喜欢编程"这个字符串,该字符串对象的length属性值与根据该字符串创建的Buffer对象的length属性值并不相同,因为字符串对象的length属性获取的是文字个数,而Buffer对象的length属性值获取的是缓冲区的长度,也就是缓冲区的字节数. 打开终端输入一些命令来创建一个字符串,然后使用该字符串创建一个Buffer对象,然后在控制台中输出字符串长度与缓冲区的长度.
dingweijun@dingweijun-ThinkPad-Edge-E430c:~$ node
> str = '我喜欢编程''我喜欢编程'
> buf = new Buffer(str);
<Buffer e6 88 91 e5 96 9c e6 ac a2 e7 bc 96 e7 a8 8b>
> str.length;
5
> buf.length;
15
>
附加点知识,可以使用以0开始的序号去取字符串对象或缓冲区中的数据,但是,在获取数据时,字符串对象也是以字节作为一个单位,而缓冲区对象(Buffer对象)以字节作为一个单位,假设,针对一个引用了字符串对象的str变量来说,str[2]获取的第三个文字,而针对一个引用缓冲区对象的buf变量来说,buf[2]获取的是缓冲区中第三个字节数据转换为整数后的数值. 打开终端输入一些命令以使用"我喜欢编程"创建一个字符串与一个Buffer对象并在控制台中输出字符串中第三个文字和缓冲区中第三个直接数据.
dingweijun@dingweijun-ThinkPad-Edge-E430c:~$ node
> str = "我喜欢编程"'我喜欢编程'
> buf = new Buffer(str)
<Buffer e6 88 91 e5 96 9c e6 ac a2 e7 bc 96 e7 a8 8b>
> str = '我喜欢编程'
'我喜欢编程'
> str [2];
'欢'
> buf [2];
145
>
还有一点就是,字符串对象一旦创建之后就不能在修改 打开终端输入一些命令以使用"我喜欢编程"创建一个字符串对象并对它进行修改,然后在控制台输出结果.
dingweijun@dingweijun-ThinkPad-Edge-E430c:~$ node
> str = '我喜欢编程'
'我喜欢编程
'> str [2] = '囍'
'囍'
> str;'我喜欢编程'
>
而Buffer对象是可以被修改的.可以通过序号来修改其中某个字节处的数据.
dingweijun@dingweijun-ThinkPad-Edge-E430c:~$ node
> buf = new Buffer('我喜欢编程')
<Buffer e6 88 91 e5 96 9c e6 ac a2 e7 bc 96 e7 a8 8b>
> buf [2] =0;0
> buf;<Buffer e6 88 00 e5 96 9c e6 ac a2 e7 bc 96 e7 a8 8b>
>
Buffer有一个用于取出指定位置处数据的slice方法,该方法的使用跟string对象的slice方法相同.
dingweijun@dingweijun-ThinkPad-Edge-E430c:~$ node
> str = '我喜欢编程'
'我喜欢编程'
>buf = new Buffer(str);
<Buffer e6 88 91 e5 96 9c e6 ac a2 e7 bc 96 e7 a8 8b>
> str.slice(2,4);
'欢编'
> buf.slice(2,4);
<Buffer 91 e5>
>
自己的解题思路是将十进制的数转为二进制(不足32位补0),然后依次取8位转化为十进制的数字,再用.连接即为IP。里面的几个点记录一下:十进制转换为二进制 numObj.toString([radix]) radix可以指定进制
参数radix支持 [2, 36] 之间的整数。例如:参数值为2,则表示二进制;为8,则表示八进制;为16,则表示十六进制。如果省略参数radix,则默认为10(十进制)。
最近在用 shell 写一个小工具,里面要用到复杂的二进制操作,对 int 值进行位操作和与或非,而 shell 的语法里, & 是取布尔与, >> 是重定向,不支持二进制操作,为了写出只需要默认系统环境就可以运行的程序
js 进制转换支持 2-36 , 即 0-9a-z .可以用于混淆、数值缩短、特殊符号转换…字符串36进制编码解码;ip地址端口号36进制编码解码
JavaScript中有很多内置函数可以帮我们进行数(进)制转换。那么给定一个十进制数字,如何将数字从十进制转换为十六进制?下面本篇文章就来给大家介绍一个使用JavaScript将十进制转换为十六进制的方法
在一般的代码中很少会接触到进制和位运算,但这不代表我们可以不去学习它。作为一位编程人员,这些都是基础知识。如果你没有学过这方面的知识,也不要慌,接下来的知识并不会很难。本文你将会学习到:进制转换,按位操作符,Javascript进制转换
将十进制数 x 除以 16, 即 x = q * 16 + r,取得余数 r 和 商 q,此时余数 r 就是 x 用十六进制表示时的最低位值; 之后商值 q 继续进行以上的除法操作, 获取每次的余数 r 作为 十六进制表示时的低位值, 直到 q 值小于 16 为值, 此时的
位运算符是基于二级制数进行操作的,即表示数字的 32 个数位,它由0和1组成…ECMAScript整数有两种类型,即有符号整数(允许用正数和负数)和无符号整数(只允许用正数)
JavaScript 中提供的进制表示方法有四种:十进制、二进制、十六进制、八进制。对于数值字面量,主要使用不同的前缀来区分:
JavaScript 提供了一些 API 来处理文件或原始文件数据,例如:File、Blob、FileReader、ArrayBuffer、base64 等。Blob 全称为 binary large object ,即二进制大对象,它是 JavaScript 中的一个对象
内容以共享、参考、研究为目的,不存在任何商业目的。其版权属原作者所有,如有侵权或违规,请与小编联系!情况属实本人将予以删除!