Beim Versuch, HOTP in Golang zu implementieren, kann es zu Diskrepanzen zwischen der von Java- und Golang-Implementierungen erzeugten Ausgabe kommen . Dies kann auf subtile Unterschiede in der Art und Weise zurückgeführt werden, wie die beiden Sprachen mit Byte-Arrays umgehen, insbesondere beim Umgang mit vorzeichenbehafteten und vorzeichenlosen Werten.
Der Bytetyp von Java ist vorzeichenbehaftet, d. h er reicht von -128 bis 127, während der Bytetyp von Golang ein Alias von uint8 ist, der von 0 bis 255 reicht. Dies Unterschiede führen zu Variationen in den von den jeweiligen Sprachen generierten Byte-Arrays.
Um die von Java und Golang generierten Byte-Arrays zu vergleichen, ist es notwendig, die vorzeichenbehafteten zu konvertieren Java-Bytewerte in ihre entsprechenden vorzeichenlosen Werte umwandeln. Dies kann durch Addition von 256 zu negativen Werten erreicht werden.
for (byte b : javabytes) { if (b < 0) { b += 256; } }
Alternativ können Sie Java-Bytewerte in einem vorzeichenlosen Format mithilfe bitweiser Operationen anzeigen:
byteValue &= 0xff;
Ein weiterer Unterschied zwischen Java und Golang ist die Bytereihenfolge langer Ganzzahlen. Java folgt der Big-Endian-Bytereihenfolge, während Golang die Little-Endian-Bytereihenfolge verwendet. Dies bedeutet, dass die Reihenfolge der Bytes im Byte-Array zwischen den beiden Sprachen unterschiedlich sein wird.
Um eine konsistente Byte-Reihenfolge zwischen Java und Golang sicherzustellen, ist dies der Fall erforderlich, um die Big-Endian-Byte-Arrays von Java in das Little-Endian-Format von Golang zu konvertieren. Dies kann mithilfe externer Bibliotheken oder durch manuelles Vertauschen der Bytereihenfolge erreicht werden.
In den bereitgestellten Codefragmenten gibt die Java-Implementierung ein hexadezimal codiertes Ergebnis zurück, während die Golang-Implementierung ein Ergebnis zurückgibt ein Base64-codiertes Ergebnis. Um die Java-Ausgabe abzugleichen, können Sie die hex.EncodeToString-Funktion in Golang verwenden.
return hex.EncodeToString(h.Sum(nil))
Um die Bytewerte von Go vorzeichenbehaftet anzuzeigen, können Sie konvertieren sie an int8, einen signierten Typ.
for _, b := range gobytes { fmt.Print(int8(b), " ") }
Das obige ist der detaillierte Inhalt vonJava vs. Golang HOTP-Implementierung: Wie lassen sich Diskrepanzen beheben?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!