Solidity入门定长字节数组

  • A+
所属分类:区块链技术

定义的方式是bytesN,其中N可取从132中的任意整数值[1]。默认的byte表示的是bytes1
使用指定长度的命名方式bytes,不是byte,多一个s,不然编译报错Error: Identifier not found or not unique
其它编程语言一般没有这样的类型。可取值范围,增长步长方面与Solidity语言自身的整数有不同[2],需注意区分。
文中代码均可通过在线Solidity浏览器编译器[3] 跑通,如你想验证你的想法,可随时输入代码验证,后文中不再一一说明[4]。

定义新变量

pragma solidity ^0.4.0;
contract FixedArrayTest {
 function arrayDefine() returns(bytes1, bytes2, bytes2){
  bytes1 a = 255;
  bytes2 b = "aA";
  uint8 i = 10;
  bytes2 c = (bytes2)(i);
  return (a, b, c);
 }
}

从上面的例子来看,定义新变量时可以使用整数字面量,或字符串字面量。

运算符

支持的比较运算符有<=<==!=>=>,返回的结果是一个bool

pragma solidity ^0.4.0;
contract FixedArrayTest {
 function arrayCompare() returns(bool, bool){
 bytes1 a = "a";
 bytes1 b = "b";
 bytes1 c = 97;
 bool r1 = a < b;//true
 bool r2 = a == c;//true
  return (r1, r2);
 }
}

定长字节数组也支持位运算符&amp;|^~,以及&lt;&lt;(左移位)&lt;&lt;(右移位)

pragma solidity ^0.4.0;
contract FixedArrayTest {
 function arrayShift() returns(bytes2, bytes2, bytes2){
  bytes2 a = 257;
  bytes2 b = a << 1;
  bytes2 c = a << 2;
 //0x0101 0x0202 0x0404
  return (a, b, c);
 }
}

移位操作符的右值必须为整数,但不能为负数,否则会报异常VM Exception: invalid opcode
移位的结果类型与操作符左值类型一致,操作符返回结果是移位后的值,移位不影响原值。

使用序号访问定长字节数组

我们还可以使用序号来访问定长字节数组的某个字节;如果数组定义的长度为N,那序号可取值是[0,N),与其它语言类似。

pragma solidity ^0.4.0;
contract FixedArrayTest {
 function arrayIndex() returns(byte, byte, byte, byte, byte){
 bytes1 a = 255;
 //a[0] 0xff 表示值255
 bytes2 b = 256;
 //b[0] 0x00 二进制表示时的底位
 //b[1] 0x01 二进制表示时的高位
 bytes2 c = "aA";
  //c[0] 0x61 字母a的ascii。
  //c[1] 0x41 字母A的ascii。
  return (a[0],b[0], b[1], c[0], c[1]);
 }
}

序号不能超过定义长度,否则编译将不能通过,Error: Out of bounds array access.

长度

定长字节数组提供了一个只读属性.length来查看其长度。

pragma solidity ^0.4.0;
contract FixedArrayTest {
 function arrayLength() returns(uint8){
  bytes3 a = 257;
  return a.length;
 }
}

.length的返回值类型是uint8
1. 原英文文档地址http://solidity.readthedocs.io/en/develop/types.html#fixed-size-byte-arrays
1. 深入浅出Solidity之一整数:http://ethfans.org/posts/311
1. 在线浏览器编译器: https://ethereum.github.io/browser-solidity/
1. 基本使用可参见,Solidity是什么:http://ethfans.org/posts/322

作者介绍:专注基于以太坊的相关区块链技术,了解以太坊,Solidity,Truffle。博客:http://me.tryblockchain.org

weinxin
共识社
用手机扫一扫,加入组织,时刻关注组织动态。
daodaoliang

发表评论

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen: