[Go] base64의 4가지 인코딩 방법의 차이점을 정리합니다.

6127 단어 Gogolangbase64tech
Go의 encoding/base64는 다음과 같은 4가지 인코딩 방식을 정의했다.
  • StdEncoding
  • URLEncoding
  • RawStdEncoding
  • RawURLEncoding
  • 이 방식별 차이를 잘 몰라서 총괄해 봤어요.
    https://pkg.go.dev/encoding/base64

    차이점


    결론은 다음과 같다.
    모드
    기호
    채우기
    StdEncoding
    + 및/
    있다
    URLEncoding
    - 및
    있다
    RawStdEncoding
    + 및/
    없음
    RawURLEncoding
    - 및
    없음
    package main
    
    import (
    	"encoding/base64"
    	"fmt"
    )
    
    func main() {
    	b := []byte("Hello, セカイ")
    
    	s1 := base64.StdEncoding.EncodeToString(b)
    	fmt.Println(s1) // SGVsbG8sIOOCu+OCq+OCpA==
    
    	s2 := base64.URLEncoding.EncodeToString(b)
    	fmt.Println(s2) // SGVsbG8sIOOCu-OCq-OCpA==
    
    	s3 := base64.RawStdEncoding.EncodeToString(b)
    	fmt.Println(s3) // SGVsbG8sIOOCu+OCq+OCpA
    
    	s4 := base64.RawURLEncoding.EncodeToString(b)
    	fmt.Println(s4) // SGVsbG8sIOOCu-OCq-OCpA
    }
    
    
    https://go.dev/play/p/R7s6Rvz6hQ0

    StdEnding과 URLEncoding의 차이점


    URL Safe는 URLEncoding입니다.Base64 예
  • a~z용 26자
  • A~Z용 26자
  • 0~9의 10자
  • +/ 2자
  • 모든 데이터의 인코딩 방식을 나타내는 총 64글자입니다.그 중에서 사용+/의 정의는 기본 64encoding이고 Go에서 StdEncoding로 정의되었다.
    한편, +/는 URL 등에서 URL 세이프가 아닌 특별한 의미를 가진다.그것 대신
  • +
  • -
  • 의 정의는 Base64 URL encoding이고 Go는 /입니다.

    Raw Enceoding과 Raw Enceoding의 차이점


    채우지 않은 것은 _URLEncoding입니다.이 두 정의는 다음과 같다.
    var RawStdEncoding = StdEncoding.WithPadding(NoPadding)
    var RawURLEncoding = URLEncoding.WithPadding(NoPadding)
    
    기본 64의 충전은 인코딩 후 문자열의 길이가 4의 배수에 이르지 않을 때 4의 배수를 부여한다.기호 사용RawStdEncoding.
    채우기는 문자열의 길이를 조절하기 위해 추가된 것이기 때문에 채우지 않아도 데이터 분실이 발생하지 않습니다.RFC의 다음 섹션에 (참조)라고 쓰여 있는 이유는 무엇입니까?
    https://datatracker.ietf.org/doc/html/rfc4648#section-3.2
    In some circumstances, the use of padding ("=") in base-encoded data
    is not required or used. In the general case, when assumptions about
    the size of transported data cannot be made, padding is required to
    yield correct decoded data.
    데이터의 큰 시간을 추정할 수 없을 때'데이터의 세그먼트'를 명확히 표시하기 위해 필요하다는 것이다.데이터 길이는 어느 정도 예측할 수 있는 상황에서 채울 필요가 없다.

    참고 자료


    https://datatracker.ietf.org/doc/html/rfc4648
    https://qiita.com/PlanetMeron/items/2905e2d0aa7fe46a36d4
    https://pkg.go.dev/encoding/base64

    좋은 웹페이지 즐겨찾기