gpt4 book ai didi

ethereum - 如何在 Solidity 中比较 ascii 字符串和 uint8 数组?

转载 作者:行者123 更新时间:2023-12-05 05:36:22 35 4
gpt4 key购买 nike

我有一个 uint8 数组,其中包含字符的 ASCII 码和一个字符串变量,我想对它们进行比较。例如:

uint8[3] memory foo = [98, 97, 122]; // baz
string memory bar = "baz";

bool result = keccak256(abi.encodePacked(foo)) == keccak256(abi.encodePacked(bytes(bar))); // false

这里我希望比较成功,但它失败了,因为 encodePacked 在编码时将保留数组中所有 uint8 元素的填充。

我该怎么做呢?

最佳答案

您当前正在将编码值 abi.encodePacked(foo)) 与散列值 keccak256(abi.encodePacked(bytes(bar)) 进行比较,两者永远不会相等。


uint8 固定大小数组存储在内存中的三个独立槽中 - 每个槽对应一个槽 - 每个槽都从右到左排序(小端)。

0x
0000000000000000000000000000000000000000000000000000000000000062
0000000000000000000000000000000000000000000000000000000000000061
000000000000000000000000000000000000000000000000000000000000007a

但是 string 文字存储为从左到右(大端)排序的动态大小字节数组:

0x
0000000000000000000000000000000000000000000000000000000000000020 # pointer
0000000000000000000000000000000000000000000000000000000000000003 # length
62617a0000000000000000000000000000000000000000000000000000000000 # value

因此,由于实际数据的存储方式不同,您无法对两个数组执行简单的字节比较。

但是,您可以遍历数组的所有项目并分别比较每个项目。

pragma solidity ^0.8;

contract MyContract {
function compare() external pure returns (bool) {
uint8[3] memory foo = [98, 97, 122]; // baz
string memory bar = "baz";

// typecast the `string` to `bytes` dynamic-length array
// so that you can use its `.length` member property
// and access its items individually (see `barBytes[i]` below, not possible with `bar[i]`)
bytes memory barBytes = bytes(bar);

// prevent accessing out-of-bounds index in the following loop
// as well as false positive if `foo` contains just the beginning of `bar` but not the whole string
if (foo.length != barBytes.length) {
return false;
}

// loop through each item of `foo`
for (uint i; i < foo.length; i++) {
uint8 barItemDecimal = uint8(barBytes[i]);
// and compare it to each decimal value of `bar` character
if (foo[i] != barItemDecimal) {
return false;
}
}

// all items have equal values
return true;
}
}

关于ethereum - 如何在 Solidity 中比较 ascii 字符串和 uint8 数组?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/73306677/

35 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com