代码之家  ›  专栏  ›  技术社区  ›  saimonsez

将简单的哈希函数从c转换为go

  •  1
  • saimonsez  · 技术社区  · 6 年前

    我正试图将一个简单的散列函数从C转换为Go。

    C->结果为{FB;01;4C | 64:KDY;KMT;KYR;KT0;TKK;PAC;UD01;UD02;UD03;ID01;ID02;ID03;SYS | 124A}

    int   sum;
    char* pChar;
    char  s[8];
    
    msg = "{FB;01;4C|64:KDY;KMT;KYR;KT0;TKK;PAC;UD01;UD02;UD03;ID01;ID02;ID03;SYS|"
    sum = 0;
    pChar = msg + 1; // sum starts after the opening {
    while (*pChar != 0) {
      sum += (int)*pChar++;
    }
    sprintf(s, "%04X}", sum);
    strcat(msg, s);
    

    Go->产生{FB;01;4C | 64:KDY;KMT;KYR;KT0;TKK;PAC;UD01;UD02;UD03;ID01;ID02;ID03;SYS | 004A}

    msg := "{FB;01;4C|64:KDY;KMT;KYR;KT0;TKK;PAC;UD01;UD02;UD03;ID01;ID02;ID03;SYS|"
    var sum uint8
    for i := 1; i < len(msg); i++ {
        sum += msg[i]
    }
    s := fmt.Sprintf("%04X}", sum)
    req := strings.Join([]string{msg, s}, "")
    fmt.Println(req)
    
    2 回复  |  直到 6 年前
        1
  •  2
  •   user539810 user539810    6 年前

    在C代码中,类型 sum int ,它是一个有符号整数类型,大小至少为16位 1个 .

    总和 uint8 在Go码中,一种不带符号的整数类型,限制为8位。

    根据格式字符串判断 %04X}

    要修复Go代码,只需更改 内景 sum += int(msg[i]) 让编译器高兴。如果你想保持 严格来说是16位,你可以用 uint16 sum += uint16(msg[i]) .

    如果你想知道为什么你需要包装 msg[i] 在里面 uint16(...) 内景 类型的值 内景 . 然而,Go没有这样的规则,只是拒绝编译,声明类型不兼容。


    req := msg + fmt.Sprintf("%04X}", sum)
    fmt.Println(req)
    

    甚至:

    s := fmt.Sprintf("%04X}", sum)
    fmt.Println(msg + sum)
    

    你现在的方法没什么问题,只是太冗长了。


    1个 在C语言中至少需要16位,在Go语言中至少需要32位,但现在在这两种语言中通常都是32位。但是,您应该知道,在某些当前系统上它可能是64位的,而且在将来的某个时候,这两种语言的默认值都可能是64位的;它们不需要保持数据类型大小同步。在添加 msg 以确保 总和 uint16标准 ).

        2
  •  4
  •   faffaffaff    6 年前