【区块链2.0 以太坊学习笔记2】动态长度字节数组与string

版权声明:本博客所有文章除特别声明外,均采用 CC BY-NC-SA 3.0 许可协议。转载请注明出处! https://blog.csdn.net/wy_97/article/details/85701248

动态字节数组

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.

总结

  1. bytes------初始化,获取bytes的长度,内容,并修改长度
  2. string------不能够直接获取其长度和单个字节内容,需要转化成bytes才可以;对于中文默认utf8编码,一个中文占3个字节
  3. 固定长度字节数组的相互转化
  4. 固定长度字节数组与动态长度字节数组及string的转化

猜你喜欢

转载自blog.csdn.net/wy_97/article/details/85701248