You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.12 16:05:15