嘗試在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中文網其他相關文章!