【问题标题】:How to correct convert bytes to bytes32 and then convert back?如何正确将字节转换为 bytes32 然后再转换回来?
【发布时间】:2020-04-02 06:25:16
【问题描述】:

我有两个合约,主合约需要输入字节 32 数组,然后主合约将字节 32 转换为地址、uint 256 和字节并调用第二个合约,这需要输入地址、uint 256 和字节

我正在尝试将此字节数据转换为字节 32

“0x793e39cd00000000000000000000000064a436ae831c1672ae81f674cab8b6775df3475c0000000000000000000000004a6bc4e803c62081ffebcc8d227b5a87a58f1f8f000000000000000000000000c4375b7de8af5a38a93548eb8453a498222c4ff20000000000000000000000000000000000000000000000001b9de674df070000” P>

但是当我将这些数据从 bytes32 转换回字节时,我得到了这个

“0x793e39cd00000000000000000000000064a436ae831c1672ae81f674cab8b677”

为了将 bytes32 转换为我使用的字节

abi.encodePacked()

为了将字节转换为字节 32,我找到了这段代码,但这不正确。

function bytesToBytes32(bytes memory source) private pure returns (bytes32 result) {
    if (source.length == 0) {
        return 0x0;
    }
    assembly {
        result := mload(add(source, 32))
    }
  }

【问题讨论】:

    标签: solidity


    【解决方案1】:

    如果您的目标是将您的 bytes 转换为 bytes32[],也许您可​​以尝试以下操作:

    function bytesToBytes32Array(bytes memory data)
        public
        pure
        returns (bytes32[] memory)
    {
        // Find 32 bytes segments nb
        uint256 dataNb = data.length / 32;
        // Create an array of dataNb elements
        bytes32[] memory dataList = new bytes32[](dataNb);
        // Start array index at 0
        uint256 index = 0;
        // Loop all 32 bytes segments
        for (uint256 i = 32; i <= data.length; i = i + 32) {
            bytes32 temp;
            // Get 32 bytes from data
            assembly {
                temp := mload(add(data, i))
            }
            // Add extracted 32 bytes to list
            dataList[index] = temp;
            index++;
        }
        // Return data list
        return (dataList);
    }
    

    【讨论】:

      猜你喜欢
      • 2014-03-18
      • 2011-08-24
      • 1970-01-01
      • 2011-05-18
      • 1970-01-01
      • 2012-01-08
      • 2015-12-19
      • 2013-11-15
      相关资源
      最近更新 更多