首頁 > 後端開發 > Golang > Java 與 Golang HOTP 實作:如何解差異?

Java 與 Golang HOTP 實作:如何解差異?

DDD
發布: 2024-12-10 19:18:17
原創
633 人瀏覽過

Java vs. Golang HOTP Implementation: How to Resolve Discrepancies?

Java 與Golang 的HOTP (rfc-4226)

嘗試在Golang 中實作HOTP 時,您可能會遇到Java 和Golang 實作產生的輸出之間的差異。這可以歸因於兩種語言處理位元組數組方式的細微差別,特別是在處理有符號和無符號值時。

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 使用小端位元組順序。這意味著兩種語言之間位元組數組中的位元組順序會有所不同。

Big-Endian 到Little-Endian 轉換

為了確保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中文網其他相關文章!

來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板