美文网首页BlockchainsolidityEthereum
【Solidity入门系列】定长字节数组

【Solidity入门系列】定长字节数组

作者: TryBlockchain | 来源:发表于2017-02-25 20:31 被阅读534次

    定义的方式是bytesN,其中N可取从132中的任意整数值[^origin]。默认的byte表示的是bytes1

    使用指定长度的命名方式bytes,不是byte,多一个s,不然编译报错Error: Identifier not found or not unique

    其它编程语言一般没有这样的类型。可取值范围,增长步长方面与Solidity语言自身的整数有不同[^integer],需注意区分。

    文中代码均可通过在线Solidity浏览器编译器[^remix] 跑通,如你想验证你的想法,可随时输入代码验证,后文中不再一一说明[^base]。

    定义新变量

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

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

    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.tryblockchain.org/Solidity-Type-ByteArrays-%E5%AD%97%E8%8A%82%E6%95%B0%E7%BB%84.html

    [2]: 深入浅出Solidity之一整数

    [3]: 在线浏览器编译器: https://ethereum.github.io/browser-solidity/

    [4]: 基本使用可参见:Solidity是什么?

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

    相关文章

      网友评论

      • 757bc236aa8c:bytes2 b = 256;
        //b[0] 0x00 二进制表示时的底位
        //b[1] 0x01 二进制表示时的高位
        这里是不是写反了,我试了一下是
        b[0] 0x01
        b[1] 0x00

      本文标题:【Solidity入门系列】定长字节数组

      本文链接:https://www.haomeiwen.com/subject/oienwttx.html