Solidity 静态字节数组
静态字节数组(fixed-size byte arrays)是 Solidity 独有的一种数据类型。与字面上的意思一样,它是固定长度的字节数组。基于静态字节数组,你可以构建出更紧凑,更节省存储空间的数据类型。
Solidity一共有32种静态字节数组: bytes1
, bytes2
, bytes3
, …, bytes32
。一个更好的理解方式是把这32个静态字节数组理解为32种不同的值类型。而不是把它们理解为通常意义上的数组。这32种静态字节数组就好像是32种大小不一的乐高积木一样。通过将它们嵌入到「结构体」里面进行排列组合我们可以构建出新的数据类型。
静态字节数组是值类型
与你预想不同的是,静态字节数组属于值类型(value type),而不是引用类型。也就是说其变量所储存的是值,而不是数据的地址。基于这个设计,当我们要获取静态字节数组的数据的时候,不需要先获取地址然后再去获取数据。对于 size 比较小的数据,将其存储在静态字节数组会更高效,更节省存储空间。
运算符
比较运算符
通过比较运算符,我们可以比较两个变量的数量大小关系,以及变量是否相等。比较运算符得到的结果是布尔值。
<=
(小于等于)<
(小于)==
(等于)!=
(不等于)>=
(大于等于)>
(大于)
比较运算
假设a=0x61 ('a'字符的ascii) , b=0x62 ('b'字符的ascii)
a<=b : true
a<b : true
a==b : false
a!=b : true
a>=b : false
a>b : false
位运算符
位运算符用来对二进制位进行操作,其执行结果是静态字节数组。
&
(按位与)|
(按位或)^
(按位异或)~
(按位取反)
位运算
假设a=0x61 ('a'字符的ascii) , b=0x62 ('b'字符的ascii)
a&b : 0x60
a|b : 0x63
a^b : 0x03
~a : 0x9e
下标访问
你可以像 Javascript 一样使用 []
运算符来通过下标访问静态字节数组的某个元素。不过要注意避免越界访问。
下标访问
bytes3 s = 'abc';
bytes1 ch = s[1]; // ch的值为0x62,也就是'b'的ascii值
小结
- 静态字节数组是固定长度的字节数组,是值类型,变量所储存的是值而不是数据的地址。
- Solidity一共有32种静态字节数组,如
bytes1
,bytes2
,bytes3
, …,bytes32
- 比较运算符可以比较两个变量的数量大小关系,以及变量是否相等,比较运算符得到的结果是布尔值。
- 位运算符用来对二进制位进行操作,执行结果是静态字节数组。
- 可以使用
[]
运算符来通过下标访问静态字节数组的某个元素,但要注意不要越界访问。
参考资料
https://docs.soliditylang.org/en/v0.8.17/types.html#fixed-size-byte-arrays https://jeancvllr.medium.com/solidity-tutorial-all-about-bytes-9d88fdb22676