JS的类型数组大体可分为3类:无符号整数、有符号整数、浮点数。
Int8Array; Uint8Array; Uint8ClampedArray; Int16Array; Uint16Array; Int32Array; Uint32Array; Float32Array; Float64Array;
基本上都可以望文生义,看名字就知道怎么回事。
但是有一个例外 Uint8ClampedArray ,它与 Uint8Array 颇为相似,但又有所区别。
因为颜色数据刚好都是符合8位二进制的无符号整数,所以这两个类型在处理Canvas绘图数据时常常用到。
Uint8ClampedArray主要用于某些特殊场景,典型的就是 ImageData.
clamped这个词的字面意思是“紧固的,夹紧的”。
如果输入的值已经是0~255之间的整数,那么Uint8Array 与 Uint8ClampedArray的最终结果是一致的。
Uint8Array 与 Uint8ClampedArray 的区别,就在于处理不在该范围(0~255之间的整数)的输入数值的转换逻辑的差异。
Uint8Array
采用的转换逻辑是
ToUint8
.
其中一个关键点是,它将输入数与256取模,将8个比特位转化为正整数,它也不会进行四舍五入。
所以 new Uint8Array([33.999]) 等价于 new Uint8Array([33.111])
特别注意,对于负数来说,由于负数的二进制存储形式是补码形式的,其转换后得到的值与输入值的联系就不直观了。
例如 -23,二进制是
11101001
即得233
(23的二进制是
00010111,它的补码就是11101001
),
所以new Uint8Array([-23]) 等价于 new Uint8Array([233])
详细规则如下:
-
Let number be ToNumber(argument).
-
ReturnIfAbrupt(number).
-
If number is NaN, +0, −0, +∞, or −∞, return +0.
-
Let int be sign(number) × floor(abs(number)).
-
Let int8bit be int modulo 28.
-
Return int8bit.
Uint8ClampedArray
采用的转换逻辑是
ToUint8Clamp
它会将负数归入0,大于255的数归入255,所以取模就不用了。
所以new Uint8ClampedArray([-23]) 等价于 new Uint8ClampedArray([
0
])
上面说到 new Uint8Array([-23]) 等价于 new Uint8Array([
233
]) ,这样就看出差别了吧。
另外,它不是直接取整,而是会处理舍入,但并不是像Math.round()那样的四舍五入,而是采用一种叫做
银行家舍入
的方法。
详细规则如下:
-
Let number be ToNumber(argument).
-
ReturnIfAbrupt(number).
-
If number is NaN, return +0.
-
If number ≤ 0, return +0.
-
If number ≥ 255, return 255.
-
Let f be floor(number).
-
If f + 0.5 < number, then return f + 1.
-
If number < f + 0.5, then return f.
-
If f is odd, then return f + 1.
-
Return f.
JS的类型数组,从其构造函数名称,基本上都可以望文生义,看名字就知道怎么回事。但是有一个例外 Uint8ClampedArray ,它与 Uint8Array 颇为相似,但又有所区别。本文详细介绍这两者之间的差异,并举例说明。
const compare = require ( 'u
int
8
array
s/compare' )
const
array
s = [
U
int
8
Array
. from ( [ 3 , 4 , 5 ] ) ,
U
int
8
Array
. from ( [ 0 , 1 , 2 ] )
const sort
ed
=
array
s . sort ( compare )
console . info ( sort
ed
)
// U
int
8
Array
[0, 1, 2]
// U
int
8
Array
[3, 4, 5]
concat(数组,[长度])
连接一个或多个U
int
8
Array
数组的数组,并返回一个U
int
8
与 API的
仅有的两个
区别
是U
int
1
Array
具有以下标准
Typed
Array
属性的特殊情况:
U
int
1
Array
.BYTES_PER_ELEMENT
返回元素大小的数字值。
BYTES_PER_ELEMENT在U
int
1
Array
的情况下等于0.125。
U
int
1
Array
.length
静态长度属性。
对于U
int
1
Array
,静态类成员length值为0。 对于实际长度(位数),请使用<U
int
1
Array
>.length 。
npm install --save u
int
1
array
您可以像普通的
Typed
Array
一样使用:
// pick an import style, either ESM or CommonJS
npm install git+https://github.com/Chocobo1/kmps.git
const Kmp = require ( 'kmps' ) ; // import this module
// working with
Typed
Array
const pattern = U
int
32
Array
. from ( [ 0xFFFF , 0x3000 ] ) ;
const corpus = U
int
32
Array
. from ( [ 0xFFFF , 0xFFFF , 0x3000 , 0x1000 ] ) ;
// setup `kmp` for later reuse
const kmp = Kmp . KnuthMorrisPratt (
大家都知道图片是由许多的像素点构成的,canvas对图像的操作也是基于像素点的,所有的像素点信息都可以存放在imag
eD
ata实例中
Imag
eD
ata() 构造函数返回一个新的实例化的 Imag
eD
ata 对象, 此对象由给定的类型化数组和指定的宽度与高度组成
new Imag
eD
ata([arr
最近,在做区块链浏览器,调用合约与链上进行数据通信的时候,需要将对象转化成十六进制字符串,看看下
javascript
关于
Array
Buffer 类型的api文档,新的如下:
array
buffer类型转16进制字符串
function buf2hex(buffer) {
return
Array
.prototype.map.call(new U
int
8
Array
(buffer), x => ('00' +
x.toString(16)).slice(-2)).j.
要在浏览器中使用,请使用 。
var isU
int
8C
lamp
ed
Array
= require ( 'validate.io-u
int
8
array
-c
lamp
ed
' ) ;
isU
int
8C
lamp
ed
Array
( 值 )
验证值是否为 。
var arr = new U
int
8C
lamp
ed
Array
( 10 ) ;
var bool = isU
int
8C
lamp
ed
Array
( arr ) ;
// returns true
var isU
int
8C
lamp
ed
Array
= require ( 'validate.io-u
int
8
array
-c
lamp
ed
' ) ;
console . log ( isU
image_to_c
用于将二进制图像文件转换为C源代码的命令行工具。 输出是无符号字符数组,并发送到stdout。 其中包括详细说明图像类型,尺寸和其他详细信息的注释。 你为什么写它? 我现有的工具(bin_to_c)与之类似,它生成C数组以将文件数据直接编译到项目中。 我已经使用此工具创建了许多.H文件以包含在我的项目中,但是仅文件名不足以了解数据中包含的图像文件的详细信息。 我没有将这些信息手动添加到每个文件中,而是想到了将我的imageinfo工具与bin_to_c工具结合起来以使某些东西变得更加有用的想法。 输出是什么样的? 这是此新工具之前和之后的示例:
变成这种类型的文件:
放入这种类型的文件:
它支持哪些图像文件类型?
PNG,JPEG,BMP,TIFF,GIF,PPM,TARGA,J
ED
MCS,CALS和PCX
无法识别的文件会怎样? 如果文件类型未知,它
Array
Buffer对象是用来表示一个通用的,固定长度的二进制数据缓冲区。
不能直接操纵
Array
Buffer的内容,
而是应该创建一个表示特定格式的buffer的类型化数组对象(
typed
array
objects)或
数据视图对象DataView 来对buffer的内容进行读取和写入操作.
Array
Buffer
Array
Buffer(unsign
ed
...
u
int
8
Array
= new U
int
8
Array
( length );
u
int
8
Array
= new U
int
8
Array
(
array
);
u
int
8
Array
= new U
int
8
Array
( buffer, byteOffset, length);
U
int
8
Array
表示8bit unsign
ed
int
egers向量,初始化为0
new U
int
8
Array
(); // new in ES2017
new U
int
8
Array
(length);
new U
int
8
Array
(
typed
Array
);
new U
int
8
Array
(object);
new U
int
8
Array
(buffer [, byteOffset [, leng...
U
int
8
Array
声明let u8a=new U
int
8
Array
(10);
console.log(u8a);//U
int
8
Array
(10) [0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
console.log(u8a.buffer);//
Array
Buffer{} .bytelength 为10
u8a.set([15,16,17],0)
console.log(u8a)