Java与Go的Integer转Byte结果不一致问题排查
问题根因
Java侧的实现没有问题,你看到的结果不一致是Go侧代码不规范导致的。
数值对应关系验证
整数1066249的十六进制表示为0x104509,按32位小端序(低位字节在前)转换为字节数组的正确结果就是[0x09, 0x45, 0x10, 0x00],对应十进制的[9, 69, 16, 0],和Java侧的输出完全匹配,说明Java侧的转换逻辑完全符合预期。
Go侧结果异常的原因
你Go侧输出的[79, 74, 16, 0]对应十六进制[0x4F, 0x4A, 0x10, 0x00],拼合后对应的整数是0x104A4F(十进制1067599),和目标值1066249不符,问题出在Go的binary.Write的使用规则:
- Go的
binary.Write会根据传入值的实际类型决定写入的字节长度,你直接传入整数字面量1066249时,默认类型是int,而Go的int是平台相关的:32位系统下占4字节,64位系统下占8字节。 - 如果你在64位系统运行代码,直接传
int类型会写入8字节的数值,你只截取前4个字节的话自然会得到错误结果。
修复方案
Go侧写入时强制指定固定长度的整数类型,和Java侧的Integer长度对齐即可,修改后的代码:
buf := bytes.NewBuffer(make([]byte, 0, 17)) binary.Write(buf, binary.LittleEndian, int32(1066249))
修改后Go侧输出的字节数组就会和Java侧完全一致。
内容的提问来源于stack exchange,提问作者GuidAnce
相关产品推荐
相关产品推荐

