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

如何在字节切片中替换不同长度字符串且不干扰数据包其他数据

解决方案

核心逻辑

  • 精准定位旧字符串的完整区间:从指定起始位置到0x00 0x00 0x00终止符的末尾
  • 分段拼接新数据包:原起始位置前的字节 + 编码后的新字符串(含终止符) + 原终止符后的所有字节
  • 严格遵循原字符串的编码规则(UCS-2小端序 + 三字节终止符),保证数据包格式兼容

完善后的代码

import (
    "bytes"
    "fmt"
    "unicode/utf16"
)

func replaceString(data []byte, newString string, startPos int) ([]byte, error) {
    // 检查起始位置是否合法
    if startPos < 0 || startPos >= len(data) {
        return nil, fmt.Errorf("start position out of bounds")
    }

    terminator := []byte{0x00, 0x00, 0x00}
    terminatorPos := bytes.Index(data[startPos:], terminator)
    if terminatorPos == -1 {
        return nil, fmt.Errorf("termination sequence not found")
    }
    // 计算旧内容的结束位置(包含三个终止符字节)
    oldContentEnd := startPos + terminatorPos + len(terminator)

    // 构造新的数据包内容
    var buf bytes.Buffer
    // 写入起始位置之前的原始字节
    buf.Write(data[:startPos])
    // 写入编码后的新字符串及终止符
    WriteS(&buf, newString)
    // 写入终止符之后的原始字节
    buf.Write(data[oldContentEnd:])

    return buf.Bytes(), nil
}

func WriteS(buf *bytes.Buffer, value string) {
    // 将字符串转换为UCS-2编码
    ucs2Chars := utf16.Encode([]rune(value))

    // 以小端序写入每个UCS-2字符的字节
    for _, char := range ucs2Chars {
        buf.WriteByte(byte(char & 0xff))        // 写入低字节
        buf.WriteByte(byte((char >> 8) & 0xff)) // 写入高字节
    }

    // 写入三字节终止符
    buf.Write([]byte{0x00, 0x00, 0x00})
}

关键说明

  • 区间定位:通过bytes.Index找到终止符相对于起始位置的偏移,计算出旧内容的完整结束位置,确保替换操作仅影响目标字符串区域
  • 高效拼接:使用bytes.Buffer处理字节拼接,既保证性能,又能灵活适配新字符串长度变化的场景
  • 格式兼容:WriteS函数完全保留原编码逻辑,确保新字符串的格式与原数据包一致,不会破坏其他数据结构
  • 错误处理:保留了起始位置越界、终止符未找到的错误判断,提前拦截非法输入

内容的提问来源于stack exchange,提问作者Ming

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.16 20:55:17