字符串字面量
字符串字面量是指由单引号,或双引号引起来的字符串。字符串并不像C语言,包含结束符,foo
这个字符串大小仅为三个字节。
定长字节数组
正如整数一样,字符串的长度类型可以是变长的。特殊之处在于,可以隐式的转换为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进制值,最终录入合适的字节。而、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;
}
}
由于一个字节是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]);
}
}
可以发现,它可以隐式的转为bytes
,上述代码的执行结果如下:
Result: "0x001122ff00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000011000000000000000000000000000000000000000000000000000000000000002200000000000000000000000000000000000000000000000000000000000000ff00000000000000000000000000000000000000000000000000000000000000"
Transaction cost: 21857 gas.
Execution cost: 585 gas.
Decoded:
bytes4: 0x001122ff
bytes1: 0x00
bytes1: 0x11
bytes1: 0x22
bytes1: 0xff