动态大小字节数组
string是一个动态尺寸的UTF-8编码字符串,它其实是一个特殊的可变字节数组,string是引用类型,而非值类型。
bytes动态字节数组,引用类型。
常规字符串string转换为bytes
string字符串中没有提供length方法获取字符串长度,也没有提供方法修改某个索引的字节码,不过我们可以将string转换为bytes,再调用length方法获取字节长度,当然可以修改某个索引的字节码。
源码
pragma solidity ^0.4.4;
contract Test {
bytes5 public g = 0x6869736565; //hisee
string public name = "hisee";
function getBytesLength() constant returns (uint) {
return g.length;
}
function nameBytes() constant returns (bytes) {
return bytes(name);
}
function nameLength() constant returns (uint) {
return bytes(name).length;
}
function setNameFirstByte(bytes1 z) {
bytes(name)[0] = z;
}
}
汉字字符串或特殊字符串的转换为bytes
特殊字符
pragma solidity ^0.4.4;
contract Test {
string public name = "hi!+&^%"; //7个字符
function nameBytes() constant returns (bytes) {
return bytes(name); //0x6869212b265e25
}
function nameLength() constant returns (uint) {
return bytes(name).length; // 7
}
}
每一个特殊字符都对应一个字节。
中文字符串
pragma solidity ^0.4.4;
contract Test {
string public name = "小白不百"; //4个汉字
function nameBytes() constant returns (bytes) {
return bytes(name); //0xe5b08fe799bde4b88de799be
}
function nameLength() constant returns (uint) {
return bytes(name).length; // 12
}
}
一个汉字占3个字节。
创建bytes字节数组
pragma solidity ^0.4.4;
contract Test {
bytes public name = new bytes(1);//设置初始大小为1字节
function setNameLength(uint length) {
name.length = length;
}
function nameLength() constant returns (uint) {
return name.length;
}
function setIndexByte(byte data,uint index) {
name[index] = data;
}
function clearByte(){
//name.length=0;
delete name; //两种方法均可清空
}
}
可变字节数组的长度可变,内容可变。
bytes可变数组length和push两个函数的使用案例
pragma solidity ^0.4.4;
contract Test {
bytes public name = new bytes(1); //设置初始大小为1字节
function setNameLength(uint length) {
name.length = length; //修改长度
}
function nameLength() constant returns (uint) {
return name.length; //获取长度
}
}
pragma solidity ^0.4.4;
contract Test {
bytes public name = new bytes(2);//设置初始大小为2字节
function setNameLength(uint length) {
name.length = length;
}
function nameLength() constant returns (uint) {
return name.length;
}
function pushByte(byte data) {
name.push(data);
}
}
push是增加一个字节,数组长度也会增加。