【2022 元宇宙基础NFT之Solidity OOP编程第17篇】3分钟了解动态字节数组、固定大小字节数组、string之间的转换关系
一、固定大小字节数组(Fixed-size byte arrays)之间的转换
固定大小字节我们可以通过bytes1 ~ bytes32
来进行声明,固定大小字节数组的长度不可变,内容不可修改。接下来我们通过下面的代码看看固定大小字节之间的转换关系。
// SPDX-License-Identifier: GPL-3.0
pragma solidity >=0.7.0 <0.9.0;
contract C {
bytes9 name9 = 0x6c697975656368756e;
function bytes9ToBytes1() view public returns (bytes1) {
return bytes1(name9); //bytes1: 0x6c
}
function bytes9ToBytes2() view public returns (bytes2) {
return bytes2(name9); //0x6c69
}
function bytes9ToBytes32() view public returns (bytes32) {
return bytes32(name9);// bytes32: 0x6c697975656368756e0000000000000000000000000000000000000000000000
}
}
结论:当bytes9
转bytes1
或者bytes2
时,会进行低位截断,0x6c697975656368756e
转换为bytes1
,结果为0x6c
,转换为bytes2
时结果为0x6c69
。当0x6c697975656368756e
转换为bytes32
时会进行低位补齐,结果为0x6c697975656368756e0000000000000000000000000000000000000000000000
。
二、固定大小字节数组(Fixed-size byte arrays)转动态大小字节数组(Dynamically-sized byte array)
// SPDX-License-Identifier: GPL-3.0
pragma solidity >=0.7.0 <0.9.0;
contract C {
bytes9 name9 = 0x6c697975656368756e;
function fixedSizeByteArraysToDynamicallySizedByteArray() view public returns (bytes memory) {
return bytes(name9);
}
}
对于刚接触的童鞋,很多人都会用上面的方法进行转换,以为理所当然,殊不知编译运行时,代码报错,原因如下:
备注:简言之,固定大小字节数组
和动态大小字节数组
之间不能简单直接转换。
下面是固定大小字节数组转动态大小字节数组
正确的姿势。
// SPDX-License-Identifier: GPL-3.0
pragma solidity >=0.7.0 <0.9.0;
contract C {
bytes9 name9 = 0x6c697975656368756e;
function fixedSizeByteArraysToDynamicallySizedByteArray() view public returns (bytes memory) {
bytes memory names = new bytes(name9.length);
for(uint i = 0; i < name9.length; i++) {
names[i] = name9[i];
}
return names;
}
}
在上面的代码中,我们根据固定字节大小数组的长度来创建一个memory
类型的动态类型的字节数组,然后通过一个for循环
将固定大小字节数组中的字节按照索引赋给动态大小字节数组即可。
三、固定大小字节数组(Fixed-size byte arrays)不能直接转换为string
// SPDX-License-Identifier: GPL-3.0
pragma solidity >=0.7.0 <0.9.0;
contract C {
bytes9 names = 0x6c697975656368756e;
function namesToString() view public returns (string memory) {
return string(names);
}
}
四、动态大小字节数组(Dynamically-sized byte array)转string
温馨提示:此处内容已隐藏,您必须消耗1个积分后才能查看。 
或者

关注微信公众号: 程序咖元宇宙实验室
回复:程序咖巴士 ,获取验证码。
验证码:
验证码: