定制XTEA算法JS转Golang后输出不一致问题求助
解决XTEA算法JS转Go后的输出不一致问题
问题根源
- sum的变化方向错误:JS中
r += -1640531527,其中-1640531527是32位有符号整数表示的XTEA delta值(0x9E3779B9),实际是sum每次减去delta;而原Go代码中是sum += delta,方向完全相反。 - 位运算行为差异:JS的
>>是算术右移(保留符号位),而Go中uint32类型的>>是逻辑右移(补0),导致右移结果不一致。 - 类型不匹配:JS中所有参与位运算的数值会被隐式转换为32位有符号整数,原Go代码用
uint32无符号类型,无法对齐这种行为。
修正后的Go代码
package main import "fmt" func sample(v *[2]int32, key *[4]int32) { const ( num_rounds int32 = 32 delta int32 = 0x9E3779B9 ) sum := int32(0) // 对齐JS的循环逻辑:从32递减到1,共32次循环 for n := num_rounds; n > 0; n-- { v[0] += (((v[1] << 4) ^ (v[1] >> 5)) + v[1]) ^ (sum + key[sum&3]) sum -= delta // 对应JS中的sum += -1640531527 v[1] += (((v[0] << 4) ^ (v[0] >> 5)) + v[0]) ^ (sum + key[(sum>>11)&3]) } } func main() { temp := [2]int32{15, 16} temp_2 := [4]int32{14, 15, 16, 17} sample(&temp, &temp_2) fmt.Println(temp) // 输出与JS一致:[1349307770 -1206370810] }
关键修改说明
- 类型替换:将
uint32改为int32,完全模拟JS的32位有符号整数运算规则,确保算术右移和溢出行为一致。 - 循环逻辑对齐:采用和JS相同的递减循环方式,避免因循环计数方式差异导致的执行顺序问题。
- sum更新修正:将
sum += delta改为sum -= delta,匹配JS中sum的变化方向。
内容的提问来源于stack exchange,提问作者Colduction
相关产品推荐
相关产品推荐

