Apabila cuba melaksanakan HOTP di Golang, anda mungkin menghadapi percanggahan antara output yang dihasilkan oleh pelaksanaan Java dan Golang . Ini boleh dikaitkan dengan perbezaan halus dalam cara kedua-dua bahasa mengendalikan tatasusunan bait, terutamanya apabila berurusan dengan nilai yang ditandatangani dan tidak ditandatangani.
Jenis bait Java ditandatangani, bermakna ia berkisar antara -128 hingga 127, manakala jenis bait Golang ialah alias bagi uint8, yang berkisar antara 0 hingga 255. Perbezaan ini membawa kepada variasi dalam tatasusunan bait yang dijana oleh bahasa masing-masing.
Untuk membandingkan tatasusunan bait yang dijana oleh Java dan Golang, adalah perlu untuk tukar nilai bait Java yang ditandatangani kepada nilai yang tidak ditandatangani yang sepadan. Ini boleh dicapai dengan menambah 256 kepada nilai negatif.
for (byte b : javabytes) { if (b < 0) { b += 256; } }
Sebagai alternatif, anda boleh memaparkan nilai bait Java dalam format yang tidak ditandatangani menggunakan operasi bitwise:
byteValue &= 0xff;
Satu lagi perbezaan antara Java dan Golang ialah susunan bait bagi integer panjang. Java mengikuti pesanan bait besar-endian, manakala Golang menggunakan pesanan bait kecil-endian. Ini bermakna susunan bait dalam tatasusunan bait akan berbeza antara kedua-dua bahasa.
Untuk memastikan susunan bait yang konsisten antara Java dan Golang, ia adalah diperlukan untuk menukar tatasusunan byte big-endian Java kepada format little-endian Golang. Ini boleh dicapai menggunakan pustaka luaran atau dengan menukar susunan bait secara manual.
Dalam coretan kod yang disediakan, pelaksanaan Java mengembalikan hasil yang dikodkan heks, manakala pelaksanaan Golang kembali hasil yang dikodkan base64. Untuk memadankan output Java, anda boleh menggunakan fungsi hex.EncodeToString dalam Golang.
return hex.EncodeToString(h.Sum(nil))
Untuk memaparkan nilai bait Go dalam cara yang ditandatangani, anda boleh menukar mereka kepada int8, iaitu jenis yang ditandatangani.
for _, b := range gobytes { fmt.Print(int8(b), " ") }
Atas ialah kandungan terperinci Pelaksanaan HOTP Java lwn Golang: Bagaimana Menyelesaikan Percanggahan?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!