尝试在 Golang 中实现 HOTP 时,您可能会遇到 Java 和 Golang 实现产生的输出之间的差异。这可以归因于两种语言处理字节数组方式的细微差别,特别是在处理有符号和无符号值时。
Java 的字节类型是有符号的,这意味着它的范围是-128到127,而Golang的byte类型是uint8的别名,范围是0到255。这种差异导致了byte的变化
要比较 Java 和 Golang 生成的字节数组,需要将有符号的 Java 字节值转换为相应的无符号值价值观。这可以通过将 256 添加到负值来实现。
for (byte b : javabytes) { if (b < 0) { b += 256; } }
或者,您可以使用按位运算以无符号格式显示 Java 字节值:
byteValue &= 0xff;
Java 和 Golang 之间的另一个区别是长整型的字节顺序。 Java 遵循大端字节顺序,而 Golang 使用小端字节顺序。这意味着两种语言之间字节数组中的字节顺序会有所不同。
为了确保 Java 和 Golang 之间字节顺序一致,将 Java 的大端字节数组转换为 Golang 的小端格式是必需的。这可以通过使用外部库或手动交换字节顺序来实现。
在提供的代码片段中,Java 实现返回十六进制编码结果,而 Golang 实现返回Base64 编码的结果。为了匹配 Java 输出,您可以使用 Golang 中的 hex.EncodeToString 函数。
return hex.EncodeToString(h.Sum(nil))
要以有符号方式显示 Go 的字节值,您可以将它们转换为 int8,这是一个有符号类型。
for _, b := range gobytes { fmt.Print(int8(b), " ") }
以上是Java 与 Golang HOTP 实现:如何解决差异?的详细内容。更多信息请关注PHP中文网其他相关文章!