动态字节数组
pragma solidity ^0.4.0;
contract ByteArray {
bytes2 public author = 0x65;//bytes后面跟的数字表示静态字节数组的长度;public表示会自动创建一个变量名相同的函数,用于读取变量
bytes public name = new bytes(2); //定义动态字节数组,初始长度定义为2
/*
定义函数获取字节数组name的长度
*/
function GetLength() public view returns (uint) {
return name.length;
}
/*
定义函数改变字节数组name的值
*/
function ChangeName() public{
name[0]=0x11;
}
/*
定义函数改变字节数组name的长度
*/
function ChangeLength() public{
name.length = 4;
}
/*
定义函数测试字节数组自带的push用法
*/
function PushTest(bytes1 demo) public {
name.push(demo);
}
}
测试的结果:
改变长度会在后面补0直到补足长度
push
函数加到动态字节数组的字节也是在末尾push
进去
String类型变量长度与单个字符的获取
pragma solidity ^0.4.0;
contract StringTest {
string author = "Sp4rksW";
/*
构造函数Getlength获取string类型变量的长度
//return author.length; string类型无length获取长度方法
可以通过强转bytes来实现或取长度
*/
function Getlength() public view returns (uint) {
return bytes(author).length;
}
/*
构造函数GetOneChar获取string类型变量的任意一个字符
//return author[0]; string不支持直接获取中间的一个字符
同理可以通过强转bytes来实现,不过转到bytes之后即为16进制,需要重新把16进制数转回字符
*/
function GetOneChar() public view returns (string) {
bytes1 onechar = bytes(author)[0];
//如果是固定大小字节数组转string,那么就需要先将字节数组转动态字节数组,再转字符串
bytes memory names = new bytes(onechar.length);
for(uint i = 0; i < onechar.length; i++) {
names[i] = onechar[i];
}
return string(names);
}
}
重要:因为string
是特殊的动态字节数组,所以string
只能和动态大小字节数组之间进行转换,不能和固定大小字节数组进行转行。
另一个值得注意的是memory
的使用:
在函数内部定义一个可变长度的数组的时候,其默认的是storage
类型
固定长度字节数组转固定长度字节数组
pragma solidity ^0.4.0;
contract bytesItobytesT {
bytes4 demo = 0x1234;
//构造函数ChangeTobytes2验证bytes4转换bytes2的过程
function ChangeTobytes2() view public returns (bytes2) {
return bytes2(demo);
}
//构造函数ChangeTobytes2验证bytes4转换bytes8的过程
function ChangeTobytes8() view public returns (bytes8) {
return bytes8(demo);
}
}
由此可知当缩小字节数组长度时,从前往后截断;
扩大字节数组时,在后面补0.
总结
bytes
------初始化,获取bytes
的长度,内容,并修改长度string
------不能够直接获取其长度和单个字节内容,需要转化成bytes
才可以;对于中文默认utf8
编码,一个中文占3个字节- 固定长度字节数组的相互转化
- 固定长度字节数组与动态长度字节数组及
string
的转化