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

定制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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.24 12:58:09