Golang에서 HOTP를 구현하려고 하면 Java와 Golang 구현에서 생성된 출력 간에 불일치가 발생할 수 있습니다 . 이는 두 언어가 바이트 배열을 처리하는 방법, 특히 부호 있는 값과 부호 없는 값을 처리할 때 미묘한 차이가 있기 때문일 수 있습니다.
Java의 바이트 유형은 부호가 있음을 의미합니다. 범위는 -128부터 127까지인 반면 Golang의 바이트 유형은 uint8의 별칭으로 범위는 0부터 255까지입니다. 차이로 인해 각 언어에서 생성되는 바이트 배열에 차이가 발생합니다.
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 구현은 16진수 인코딩 결과를 반환하는 반면 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 중국어 웹사이트의 기타 관련 기사를 참조하세요!