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

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

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

通学智能合约系列(六)--字节数组_第1张图片

动态长度字节数组

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

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;
    }
}

通学智能合约系列(六)--字节数组_第2张图片

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

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

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

function pushTest(){
name.push(0x99);
}
执行后,我们会发现,添加的字节会追加在我们原始字节的末尾,并且数组的长度也会发生相应改变。

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

你可能感兴趣的:(区块链之变化,区块链,智能合约)