634
技術社區[雲棲]
『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
}
說明
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 1100
,0x6c
對應的內容為l
,而0x6c69
對應的內容為li
,以此內推0x6c697975656368756e
對應的內容為liyuechun
。
PS:
byte
和bytes1
等價,隻能存儲一個字節,當超過它的存儲範圍時就會報錯,如下圖所示:
操作運算符
- 比較運算符:
<=
,<
,==
,!=
,>=
,>
- 位操作符:
&
,|
,^(異或)
,~ (取反)
,<< (左移)
,>> (右移)
- 索引訪問:如果
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