5.数组

固定长度字节数组

关键字有:bytes1,bytes2mbytes3,…,bytes32(以步长1递增)。byte代表bytes1。

pragma solidity ^0.4.16;

contract ByteArray{

bytes1 public num1 = 0x7a;

bytes2 public num2 = 0x7a68;

bytes12 public num3 = 0x7a68656e676a69616e78756e;
}

固定长度字节数组对于数值来说,有点等同于我们的uint。一个字节等于8位。即bytes1 有点等同于uint8,至少在位数上是相等的。

上面的例子,我们同时引入了一个public修饰合约成员变量的范例,在solidity中,直接用public声明成员变量,编译部署后,会为我们生成一个默认的get方法,让我们可以直接调用这个成员属性。说起来还真的挺方便的呢。

刚才我们说过,字节数组byte和uint的内存模型是一样的,那么字节数组直接肯定也是可以进行一些运算操作的,支持的操作有布尔运算和位运算,这里就不再做过多赘述,大家可以参照我之前的位运算进行演练。

此外大家要注意,固定长度字节数组作为一个整体,其内部某个字段是不能够被修改的。会报错~

通学智能合约系列(六)--字节数组_位运算

动态长度字节数组

上面我们知道了,固定长度自己数组内容是不能被修改的,那么我想要修改怎么办呢。这就要拿出我们的动态长度字节数组了。他不但可以修改其内容,也可以修改其长度。下面我们来看看吧。

pragma solidity ^0.4.16;

contract DynamicByteArray{

bytes public name = new bytes(2);

function initName(){
name[0] = 0x7a;
name[1] = 0x68;
}

function getLength() view returns(uint){
return name.length;
}

function changeName(){
name[0] = 0x88;
}

function changeLength(){
name.length = 5;
}
}

通学智能合约系列(六)--字节数组_字节数组_02

我们这里可以依次执行getLength,initName,name,changName,name,changeLength,getLength看看结果。会发现,改变数组就是这么任性。

但是,我们思考一下,如果我先执行了初始化惭怍,然后改变了数组长度,这个多出来的部分会是在我们数组的左边填充还是右边填充呢?这个大家可以自己试试,评论区告诉我答案哦。

此外,我们的动态数组,还提供了一个push方法,可以在我们自己数组的末尾继续添加我们的字节元素。

function pushTest(){

name.push(0x99);

}

执行后,我们会发现,添加的字节会追加在我们原始字节的末尾,并且数组的长度也会发生相应改变。

这节,我们先简单开了个数组的头头。下节,我们将介绍我们一种特殊的动态自己数组,也就是我们的字符数组,字符串。敬请期待吧。