目录
动态字节数组
pragma solidity ^0.4.0;
contract array{
bytes public name = new bytes(2);
function InitName(){
name[0] = 0x7a;
name[1] = 0x68;
}
function getLength() view returns(uint){
return name.length;
}
function changeName(){
name[0] = 0x88;
}
function changeLength(){
name.length = 5;
}
function pushtest(){
name.push(0x99);//往数组后面添加一个元素,length长度会发生变化
}
}
在solidity中,name[]存储的初始化结果为(大小为2):0x0000。这里分析:每两个位就是一个8位的byte,然后把所有组放到一起显示。比如:InitName之后,为0x7a68。changeLength之后,为0x7a68000000。动态数组变现为,pushtest之后,变为:0x7a6800000099,数组长度+1,即从5变成6。
以字节为单位进行操作
string内存原理——特殊动态数组
pragma solidity ^0.4.0;
contract string_{//string内存原理——特殊动态数组
string name = "huangxiaoming";
//0x6875616e677869616f6d696e67
function getLength() returns(uint){
//return name.length; !string是没有length属性的
return bytes(name).length;//这里强转为bytes数组,而bytes数组有length属性
}
function changeName() returns(bytes1){//byte是byte1的别名
//return name[0]; !无法通过下标来获得
//要通过bytes强转的方式
return bytes(name)[0];
//这里会返回两个位:0x6875616e677869616f6d696e67 返回0x68
}
function getName() view returns(bytes) {
return bytes(name);
}
function getName2(){
bytes(name)[0] = 'L';//修改第一个元素
//结果:0x6875616e677869616f6d696e67——>0x4c75616e677869616f6d696e67
}
}
string处理中文和特殊字符
string来存储中文或者特殊字符。特殊字符:每一个占一个字节;中文:每一个字占三个字节。如:熊猫怪:长度为3,0x123456789987654321,共18位(那个0x是我编的,但肯定是18位)
固定长度字节数组的转换
pragma solidity ^0.4.0;
contract changeBytes{
bytes12 name = 0x6875616e67786875616e6778;
function changeBytes1() view returns(bytes1){
return bytes1(name);//0x68
}
function changeBytes2() view returns(bytes2){
return bytes2(name);//0x6875
}
function changeBytes16() view returns(bytes16){
return bytes16(name);//0x6875616e67786875616e677800000000
}
}