如何在Solidity中对memory类型bytes进行切片?
Solidity中bytes memory的切片实现方法
Solidity存在语法限制:动态calldata数组支持范围索引访问(如data[start:end]),但memory数组不支持,所以直接对bytes memory执行切片操作会抛出TypeError: Index range access is only supported for dynamic calldata arrays。
针对bytes memory,可以通过以下两种方式实现切片需求:
方法一:内联汇编实现(性能最优)
利用内联汇编直接操作内存,是效率最高的方案:
function sliceBytesMemory(bytes memory data, uint start, uint length) internal pure returns (bytes memory) { bytes memory result = new bytes(length); assembly { // 设置结果数组的长度 mstore(add(result, 0x20), length) // 从data的start偏移位置复制length字节到result内存区域 calldatacopy(add(result, 0x20), add(add(data, 0x20), start), length) } return result; }
方法二:纯Solidity循环复制(可读性高)
无需汇编,通过循环逐个复制字节,适合对汇编不熟悉的场景:
function sliceBytesMemory(bytes memory data, uint start, uint length) internal pure returns (bytes memory) { require(start + length <= data.length, "Slice out of bounds"); bytes memory result = new bytes(length); for (uint i = 0; i < length; i++) { result[i] = data[start + i]; } return result; }
使用示例
将原代码bytes memory bytesData = result[32:64];替换为:
bytes memory bytesData = sliceBytesMemory(result, 32, 32);
(注:32是切片长度,由64-32计算得出)
内容的提问来源于stack exchange,提问作者Matt Jaf
相关产品推荐
相关产品推荐

