1.如何修改string类型
pragma solidity ^0.4.0;
contract stringtest1{
string testword='helloworld'; //68656c6c6f776f726c64为这串字符的16进制
function stringlength() public view returns (uint){
//return testword.length; 直接返回长度会报错
return bytes(testword).length; //强制类型转换之后可以
}
function stringchange() public {
//testword[0]='A'; 直接进行变更会报错
bytes(testword)[0]='A'; //41为A的16进制值,强制类型转换之后可以修改
}
function getname() public view returns(bytes){
return bytes(testword); //查看16进制的string
}
function stringchangetest() public view returns(byte){
return bytes(testword)[0]; //查看第一位是否被修改
}
}
测试结果
一开始getname和stringlength的显示结果都正常
运行stringchange之后,发现第一位从68变成了41,修改成功
2.string类型是怎么存储数据的
英文字符(A-z)以及特殊字符(&*@#&%())等为一个字节
中文字符为3个字节 PS.solidity中文输入支持很差
举例
contract stringstoragetest{
string testword1='asldhlkasdh';
string testword2='^*^*%*()*-/';
string testword3='中文测试';
string testword4='中文测试2222';
function stringstoragetest1() public view returns(uint){
return bytes(testword1).length;
}
function stringstoragetest2() public view returns(uint){
return bytes(testword2).length;
}
function stringstoragetest3() public view returns(uint){
return bytes(testword3).length;
}
function stringstoragetest4() public view returns(uint){
return bytes(testword4).length;
}
}
测试结果
可见中文一个占3个字节,中文和英文同时存在时互不干扰
解释:储存中文和一些其他语言时,solidity使用的时UTF-8格式存储的
3.固定长度字节数组bytes的截断
结论:位数足够则保留前面的,位数不够再后面加0
测试程序
contract bytetest1{
bytes10 testword=0x68656c6c6f776f726c64; //helloworld
function transbytes1() public view returns(bytes1){
return bytes1(testword);
}
function transbytes2() public view returns(bytes5){
return bytes5(testword);
}
function transbytes3() public view returns(bytes12){
return bytes12(testword);
}
}
运行结果
4.将固定长度数组变为可变长度数组
方法:即再构造另一个可变程度数组然后一个个赋值过去即可
代码如下
contract arrtranstest{
bytes10 testword=0x68656c6c6f776f726c64;
bytes transarr = new bytes(testword.length);
function setvalue() public {
for(uint i=0;i<testword.length;i++){
transarr[i]=testword[i];
}
}
function showtransarr() public view returns(bytes){
return transarr;
}
}
运行结果
首先点击查看可以看见transarr没有被赋值
然后点击setvalue之后再点击查看就可发现可变长度数组已经被赋值
5.将可变长度字节数组bytes转化为可以显示字符的string
方法:直接强制转化即可
代码
contract bytestostring{
bytes testword = new bytes(10);
function setvalue() public {
testword.push(0x68);
testword.push(0x4d);
}
function showtransarr() public view returns(string){
return string(testword);
}
}
运行结果
6.将固定长度字节数组转化为string类型
思路:既然存在一下两种转换
1.固定长度字节数组转化为可变长度字节数组
2.可变长度字节长度数组转化为string类型
那么我们综合12便可得到我们的解法
contract bytes32tostring{
bytes10 testword=0x68656c6c6f776f726c64; //为helloworld
function bytes32tostringF() public view returns(string){
uint count=0; //这里必须初始为uint,否则报错
for(uint i=0;i<testword.length;i++){
bytes1 tester=testword[i];
if(tester!=0x00){//此步计算出所有不为空值的位数
count++;
}
}
bytes memory transarr=new bytes(count);//声明一个新的可变数组,长度为之前的count,
//这样就不会导致转化后后面过多的方框了
for(uint j=0;j<count;j++){//重新对可变数组进行赋值
transarr[j]=testword[j];
}
return string(transarr);//强制转化即可
}
}
运行结果
注意:
1.固定长度字节数组不能直接强制转化为string,否则会报错无法编译通过
2.如果不使用count来计数,那么可变长度数组前面为原来固定长度数组的值,后面则全部为0,强制转化出来的string后面就会带许多的“口”(表示未知字符),所以需要使用count来对所有有效字符进行计数