function boxURL(uint boxID_) public view returns (string memory) { require(boxMap[boxID_].id != 0, "box not exist"); return string(abi.encodePacked(baseURL, boxID_)); }
看了一个别人的合约。 这里为啥要用encodePacked呢?时什么作用。我调用合约返回的后面部分是乱码字符。不能直接拼接String吗?
baseURL = "http://192.168.1.1/" boxID_ = 1
abi.encodePacked(baseURL, boxID_) 结果为:0x687474703a2f2f3139322e3136382e312e312f0000000000000000000000000000000000000000000000000000000000000001 0x687474703a2f2f3139322e3136382e312e312f是"http://192.168.1.1/"的编码 0000000000000000000000000000000000000000000000000000000000000001是uint256(1)的编码 这种情况下,是先分别编码再拼接
而 abi.encodePacked(baseURL, Strings.toString(boxID_) 结果为: 0x687474703a2f2f3139322e3136382e312e312f31 ”http://192.168.1.1/1“的编码 这种情况下,是先拼接再编码