定义的方式是bytesN
,其中N可取从1
到32
中的任意整数值[^origin]。默认的byte
表示的是bytes1
。
使用指定长度的命名方式bytes
,不是byte
,多一个s
,不然编译报错Error: Identifier not found or not unique
。
其它编程语言一般没有这样的类型。可取值范围,增长步长方面与Solidity语言自身的整数有不同[^integer],需注意区分。
文中代码均可通过在线Solidity浏览器编译器[^remix] 跑通,如你想验证你的想法,可随时输入代码验证,后文中不再一一说明[^base]。
定义新变量
pragma solidity ^0.4.0;
contract FixedArrayTest {
function arrayDefine() returns(bytes1, bytes2, bytes2){
bytes1 a = 255;
bytes2 b = "aA";
uint8 i = 10;
bytes2 c = (bytes2)(i);
return (a, b, c);
}
}
从上面的例子来看,定义新变量时可以使用整数字面量,或字符串字面量。
运算符
支持的比较运算符有<=
,<
,==
,!=
,>=
,>
,返回的结果是一个bool
。
pragma solidity ^0.4.0;
contract FixedArrayTest {
function arrayCompare() returns(bool, bool){
bytes1 a = "a";
bytes1 b = "b";
bytes1 c = 97;
bool r1 = a < b;//true
bool r2 = a == c;//true
return (r1, r2);
}
}
定长字节数组也支持位运算符&
,|
,^
,~
,以及<<(左移位)
,<<(右移位)
。
pragma solidity ^0.4.0;
contract FixedArrayTest {
function arrayShift() returns(bytes2, bytes2, bytes2){
bytes2 a = 257;
bytes2 b = a << 1;
bytes2 c = a << 2;
//0x0101 0x0202 0x0404
return (a, b, c);
}
}
移位操作符的右值必须为整数
,但不能为负数,否则会报异常VM Exception: invalid opcode
。
移位的结果类型与操作符左值类型一致,操作符返回结果是移位后的值,移位不影响原值。
使用序号访问定长字节数组
我们还可以使用序号来访问定长字节数组的某个字节;如果数组定义的长度为N
,那序号可取值是[0,N)
,与其它语言类似。
pragma solidity ^0.4.0;
contract FixedArrayTest {
function arrayIndex() returns(byte, byte, byte, byte, byte){
bytes1 a = 255;
//a[0] 0xff 表示值255
bytes2 b = 256;
//b[0] 0x00 二进制表示时的底位
//b[1] 0x01 二进制表示时的高位
bytes2 c = "aA";
//c[0] 0x61 字母a的ascii。
//c[1] 0x41 字母A的ascii。
return (a[0],b[0], b[1], c[0], c[1]);
}
}
序号不能超过定义长度,否则编译将不能通过,Error: Out of bounds array access.
长度
定长字节数组提供了一个只读属性.length
来查看其长度。
pragma solidity ^0.4.0;
contract FixedArrayTest {
function arrayLength() returns(uint8){
bytes3 a = 257;
return a.length;
}
}
.length
的返回值类型是uint8
。
[1]: 原英文文档地址 访问中文文档地址 -> http://solidity.tryblockchain.org/Solidity-Type-ByteArrays-%E5%AD%97%E8%8A%82%E6%95%B0%E7%BB%84.html ↩
[2]: 深入浅出Solidity之一整数 ↩
[3]: 在线浏览器编译器: https://ethereum.github.io/browser-solidity/ ↩
[4]: 基本使用可参见:Solidity是什么? ↩
作者介绍:专注基于以太坊的相关区块链技术,了解以太坊,Solidity,Truffle。博客:http://me.tryblockchain.org
网友评论
//b[0] 0x00 二进制表示时的底位
//b[1] 0x01 二进制表示时的高位
这里是不是写反了,我试了一下是
b[0] 0x01
b[1] 0x00