閱讀634 返回首頁    go 技術社區[雲棲]


『0013』 - Solidity Types - 固定大小字節數組(Fixed-size byte arrays)

孔壹學院:國內區塊鏈職業教育領先品牌

作者:黎躍春,區塊鏈、高可用架構工程師
微信:liyc1215 QQ群:348924182 博客:https://liyuechun.org

固定大小字節數組(Fixed-size byte arrays)

固定大小字節數組可以通過 bytes1, bytes2, bytes3, ..., bytes32來進行聲明。PS:byte的別名就是 byte1

  • bytes1隻能存儲一個字節,也就是二進製8位的內容。
  • bytes2隻能存儲兩個字節,也就是二進製16位的內容。
  • bytes3隻能存儲三個字節,也就是二進製24位的內容。
  • ......
  • bytes32能存儲三十二個字節,也就是二進製32 * 8 = 256位的內容。
pragma solidity ^0.4.4;

contract C {

    // 0x6c697975656368756e

    byte public a = 0x6c; // 0110 1100
    bytes1 public b = 0x6c; // 0110 1100
    bytes2 public c = 0x6c69; // 0110 1100 0110 1001
    bytes3 public d = 0x6c6979; // 0110 1100 0110 1001 0111 1001
    bytes4 public e = 0x6c697975; // 0110 1100 0110 1001 0111 1001 0111 0101

    // ...

    bytes8 public f = 0x6c69797565636875; // 0110 1100 0110 1001 0111 1001 0111 0101 0110 0101 0110 0011 0110 1000 0111 0101
    bytes9 public g = 0x6c697975656368756e; // // 0110 1100 0110 1001 0111 1001 0111 0101 0110 0101 0110 0011 0110 1000 0111 0101 0110 1110

}

Fixed-size byte arrays

說明

0x 6c 69 79 75 65 63 68 75 6e是一個十六進製的整數,它的二進製碼是0b 0110 1100 0110 1001 0111 1001 0111 0101 0110 0101 0110 0011 0110 1000 0111 0101 0110 1110,在計算機中0b 0110 1100 0110 1001 0111 1001 0111 0101 0110 0101 0110 0011 0110 1000 0111 0101 0110 1110二進製碼存儲的內容其實就是liyuechun我名字的全拚。我們都知道,在計算機中,所以的內容,不管是圖片、文字、視頻,任何資料我們都可以轉換成二進製碼在計算機中進行存儲。

在計算機中,一個字母或者一個數字的存儲空間為一個字節,也就是8位二進製位。一個漢字兩個字節,也就是16位

0x6c697975656368756e中,0x6c是一個字節,因為16進製中,一個數字等價於二進製中的4位,兩個數字等價於8位,剛好一個字節,0x6c用二進製來表示是0b 0110 11000x6c對應的內容為l,而0x6c69對應的內容為li,以此內推0x6c697975656368756e對應的內容為liyuechun

PS:

bytebytes1等價,隻能存儲一個字節,當超過它的存儲範圍時就會報錯,如下圖所示:

操作運算符

  • 比較運算符:<=, <, ==, !=, >=, >
  • 位操作符:&, |, ^(異或), ~ (取反), << (左移), >> (右移)
  • 索引訪問:如果x是一個bytesI,那麼可以通過x[k](0 < k < I)獲取對應索引的字節,**PS:**x[k]是隻讀,不可寫。

成員函數

  • .length 返回字節的個數。(隻讀)
pragma solidity ^0.4.4;

contract C {

    bytes9 public g = 0x6c697975656368756e;

    function gByteLength() constant returns (uint) {

        return g.length;
    }

}

不可變深度解析

長度不可變

pragma solidity ^0.4.4;

contract C {


    bytes9  name = 0x6c697975656368756e;

    function setNameLength(uint length) {

        // 報錯
        name.length = length;
    }

}

內部字節不可修改

pragma solidity ^0.4.4;

contract C {


    bytes9  name = 0x6c697975656368756e;

    function setNameFirstByte(byte b) {

        name[0] = b;
    }

}

總結

bytesI(1 <= I <= 32)可以聲明固定字節大小的字節數組變量,一旦聲明,內部的字節和字節數組長度不可修改,當然可以通過索引讀取(隻讀)對應索引的字節,或者通過length讀取字節數組的字節數。

技術交流

  • 區塊鏈技術交流QQ群:348924182

  • 「區塊鏈部落」官方公眾號

最後更新:2017-10-27 22:04:17

  上一篇:go  『0014』 - Solidity Types - 動態大小字節數組(Dynamically-sized byte array)
  下一篇:go  【轉載】Kubernetes 入駐 Docker EE,企業如何享受更簡易、更安全的部署?