如何在字节切片中替换不同长度字符串且不干扰数据包其他数据
解决方案
核心逻辑
- 精准定位旧字符串的完整区间:从指定起始位置到
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
相关产品推荐
相关产品推荐

