Solidify实现一个智能合约8(动态大小字节数组)

动态大小字节数组

string是一个动态尺寸的UTF-8编码字符串,它其实是一个特殊的可变字节数组,string是引用类型,而非值类型。

bytes动态字节数组,引用类型。

常规字符串string转换为bytes

string字符串中没有提供length方法获取字符串长度,也没有提供方法修改某个索引的字节码,不过我们可以将string转换为bytes,再调用length方法获取字节长度,当然可以修改某个索引的字节码。

源码

pragma solidity ^0.4.4;
contract Test {

  bytes5 public g = 0x6869736565; //hisee
  string public name = "hisee";
  
  function getBytesLength() constant returns (uint) {
    return g.length;
  }
  function nameBytes() constant returns (bytes) {
    return bytes(name);
  }
  function nameLength() constant returns (uint) {
    return bytes(name).length;
  }
  function setNameFirstByte(bytes1 z) {
    bytes(name)[0] = z;
  }
}

汉字字符串或特殊字符串的转换为bytes

特殊字符

pragma solidity ^0.4.4;
contract Test {

  string public name = "hi!+&^%"; //7个字符
  
  function nameBytes() constant returns (bytes) {
    return bytes(name);  //0x6869212b265e25
  }
  function nameLength() constant returns (uint) {
    return bytes(name).length; // 7
  }
}

每一个特殊字符都对应一个字节。

中文字符串

pragma solidity ^0.4.4;
contract Test {

  string public name = "小白不百"; //4个汉字
  
  function nameBytes() constant returns (bytes) {
    return bytes(name);  //0xe5b08fe799bde4b88de799be
  }
  function nameLength() constant returns (uint) {
    return bytes(name).length; // 12
  }
}

一个汉字占3个字节。

创建bytes字节数组

pragma solidity ^0.4.4;
contract Test {

  bytes public name = new bytes(1);//设置初始大小为1字节
  function setNameLength(uint length) {
    name.length = length;
  }
  function nameLength() constant returns (uint) {
    return name.length; 
  }
  function setIndexByte(byte data,uint index) {
    name[index] = data;
  }
  
  function clearByte(){
      //name.length=0;
      delete name; //两种方法均可清空
  }
}

可变字节数组的长度可变,内容可变。

bytes可变数组length和push两个函数的使用案例

pragma solidity ^0.4.4;
contract Test {

  bytes public name = new bytes(1);  //设置初始大小为1字节
  function setNameLength(uint length) {
    name.length = length; //修改长度
  }
  function nameLength() constant returns (uint) {
    return name.length;  //获取长度
  }
  
}
pragma solidity ^0.4.4;
contract Test {

  bytes public name = new bytes(2);//设置初始大小为2字节
  
  function setNameLength(uint length) {
    name.length = length;
  }
  function nameLength() constant returns (uint) {
    return name.length; 
  }
  function pushByte(byte data) {
    name.push(data);
  }

}

push是增加一个字节,数组长度也会增加。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值