字符串字面量
字符串字面量是指由單引號尼摹,或雙引號引起來的字符串吴超。字符串并不像C語言钉嘹,包含結束符,foo
這個字符串大小僅為三個字節(jié)烛芬。
定長字節(jié)數(shù)組
正如整數(shù)一樣隧期,字符串的長度類型可以是變長的。特殊之處在于赘娄,可以隱式的轉換為byte1
····byte32
仆潮。
eg:
pragma solidity ^0.4.17;
contract StringTest {
function test() public pure returns (bytes3){
bytes3 a = "123";
bytes3 b = "1234";
//Error: Type literal_string "1234" is not implicitly convertible to expected type bytes3.
return a;
}
}
- 上述的字符串字面量,會隱式轉換為
bytes3
遣臼。但這樣不是理解為bytes3
的字面量方式一個意思性置。
轉義字符
字符串字面量支持轉義字符,比如\n
揍堰,\xNN
鹏浅,\uNNN
。其中屏歹、xNN
表式16進制值隐砸,最終錄入合適的字節(jié)。而蝙眶、uNNN
表示Unicode
碼的值季希,最終會轉換為UTF8
的序列。
十六進制字面量
十六進制字面量幽纷,以關鍵字hex
打頭式塌,后面緊跟用單或雙引號包裹的字符串。如hex"001122ff"
友浸。在內部會表示為二進制流峰尝。
eg:
pragma solidity ^0.4.17;
contract StringTest {
function test() public pure returns (string){
var a = hex"001122FF";
//var b = hex"A";
//Expected primary expression
return a;
}
}
由于一個字節(jié)是8位,所以一個hex
是由倆個[0-9a-z]
字符組成的收恢。所以var b = hex"A";不是成雙的字符串是會報錯的武学。
轉換
十六進制的字面量與字符串可以進行同樣的類似操作:
pragma solidity ^0.4.17;
contract StringTest {
function test() public pure returns (string){
var a = hex"001122FF";
//var b = hex"A";
//Expected primary expression
return a;
}
function test1() public pure returns (bytes4, bytes1, bytes1, bytes1, bytes1){
bytes4 a = hex"001122FF";
return (a, a[0], a[1], a[2], a[3]);
}
}
可以發(fā)現(xiàn)祭往,它可以隱式的轉為bytes
,上述代碼的執(zhí)行結果如下:
Result: "0x001122ff00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000011000000000000000000000000000000000000000000000000000000000000002200000000000000000000000000000000000000000000000000000000000000ff00000000000000000000000000000000000000000000000000000000000000"
Transaction cost: 21857 gas.
Execution cost: 585 gas.
Decoded:
bytes4: 0x001122ff
bytes1: 0x00
bytes1: 0x11
bytes1: 0x22
bytes1: 0xff