Skip to main content

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值
试一试 »

小结

  1. 静态字节数组是固定长度的字节数组,是值类型,变量所储存的是值而不是数据的地址。
  2. Solidity一共有32种静态字节数组,如 bytes1, bytes2, bytes3, …, bytes32
  3. 比较运算符可以比较两个变量的数量大小关系,以及变量是否相等,比较运算符得到的结果是布尔值。
  4. 位运算符用来对二进制位进行操作,执行结果是静态字节数组。
  5. 可以使用 [] 运算符来通过下标访问静态字节数组的某个元素,但要注意不要越界访问。

参考资料

https://docs.soliditylang.org/en/v0.8.17/types.html#fixed-size-byte-arrays https://jeancvllr.medium.com/solidity-tutorial-all-about-bytes-9d88fdb22676