diff --git a/protocol/src/main/java/com/zfoo/protocol/buffer/ByteBufUtils.java b/protocol/src/main/java/com/zfoo/protocol/buffer/ByteBufUtils.java index a36e0fcb..9326c5bb 100644 --- a/protocol/src/main/java/com/zfoo/protocol/buffer/ByteBufUtils.java +++ b/protocol/src/main/java/com/zfoo/protocol/buffer/ByteBufUtils.java @@ -371,9 +371,25 @@ public abstract class ByteBufUtils { // 预估需要写入的字节数,并预留位置 var beforeWriteIndex = byteBuf.writerIndex(); var maxLength = ByteBufUtil.utf8MaxBytes(value); - writeInt(byteBuf, maxLength); - byteBuf.writeCharSequence(value, StringUtils.DEFAULT_CHARSET); - adjustPadding(byteBuf, maxLength, beforeWriteIndex); + var writeIntCountByte = writeInt(byteBuf, maxLength); + + var length = byteBuf.writeCharSequence(value, StringUtils.DEFAULT_CHARSET); + + var currentWriteIndex = byteBuf.writerIndex(); + + // 因为写入的是可变长的int,如果预留的位置过多,则清除多余的位置 + var padding = writeIntCountByte - writeIntCount(length); + if (padding == 0) { + byteBuf.writerIndex(beforeWriteIndex); + writeInt(byteBuf, length); + byteBuf.writerIndex(currentWriteIndex); + } else { + var retainedByteBuf = byteBuf.retainedSlice(currentWriteIndex - length, length); + byteBuf.writerIndex(beforeWriteIndex); + writeInt(byteBuf, length); + byteBuf.writeBytes(retainedByteBuf); + ReferenceCountUtil.release(retainedByteBuf); + } } public static String readString(ByteBuf byteBuf) {