>  기사  >  백엔드 개발  >  golang 바이트 순서 변환

golang 바이트 순서 변환

PHPz
PHPz원래의
2023-05-14 15:03:37681검색

Golang은 프로그래머가 다양한 작업을 쉽게 처리할 수 있도록 풍부한 내장 함수 및 데이터 유형 세트를 제공하는 최신 프로그래밍 언어입니다. 엔디안 변환도 매우 중요한 작업입니다. 이 기사에서는 Golang에서 엔디안 변환을 수행하는 방법을 심도 있게 설명합니다.

바이트 순서란 무엇인가요?

컴퓨터 저장 장치에서 바이트는 가장 작은 저장 단위이며 각 바이트는 8개의 바이너리 비트로 구성됩니다. 엔디안(Endianness)이란 정수, 부동소수점 수 등 멀티바이트 데이터를 저장할 때 메모리에 바이트가 배열되는 순서를 말한다. 바이트 순서에는 빅 엔디안과 리틀 엔디안의 두 가지 유형이 있습니다.

빅엔디안은 상위 바이트가 먼저, 하위 바이트가 마지막에 저장되는 방식을 말하며 네트워크 전송 및 대부분의 컴퓨터 CPU에 흔히 사용됩니다. 예를 들어 숫자 10의 이진수 표현은 0000 1010입니다. 빅엔디안 순서로 저장되면 메모리의 순서는 0000 1010입니다.

Little endian은 낮은 순서의 바이트가 먼저, 높은 순서의 바이트가 마지막에 저장되는 방식입니다. 이는 Intel x86 및 ARM 아키텍처와 같은 일부 프로세서 아키텍처에서 일반적으로 사용됩니다. 예를 들어 리틀 엔디안 저장소에서 숫자 10의 순서는 1010 0000입니다.

Golang의 엔디안 변환

Golang에서 엔디안 변환은 주로 표준 라이브러리의 "인코딩/바이너리" 패키지를 사용합니다. 이 패키지는 바이너리 디코딩 및 인코딩, 빅 및 스몰 엔디안 변환 등을 포함하여 바이트 순서를 변환하는 여러 기능을 제공합니다.

  1. 바이너리 디코딩

"인코딩/바이너리" 패키지의 "읽기" 기능 시리즈는 바이트 스트림을 해당 데이터 유형으로 디코딩하는 데 사용됩니다. 그 중 "binary.Read" 함수에는 입력 바이트 스트림, 대상 개체의 포인터, 사용된 엔디안 유형이라는 세 가지 매개 변수가 있습니다. 예:

func main() {
    bytes := []byte{0x10, 0x27, 0x00, 0x00}
    var i int32
    err := binary.Read(bytes.NewReader(bytes), binary.LittleEndian, &i)
    if err != nil {
        log.Fatal("binary.Read failed:", err)
    }
    fmt.Println(i) // Output: 10000
}

위 코드는 리틀 엔디안 순서의 바이트 스트림 [0x10, 0x27, 0x00, 0x00]을 int32 유형의 변수 i로 디코딩합니다.

  1. 바이너리 인코딩

"인코딩/바이너리" 패키지의 "쓰기" 기능 시리즈는 지정된 바이트 순서에 따라 데이터 유형을 바이너리 스트림으로 인코딩하는 데 사용됩니다. 그 중 "binary.Write" 함수에는 출력 바이트 스트림, 사용된 엔디안 유형, 인코딩할 값이라는 세 가지 매개변수가 있습니다. 예:

func main() {
    var i int32 = 10000
    buf := new(bytes.Buffer)
    err := binary.Write(buf, binary.LittleEndian, i)
    if err != nil {
        log.Fatal("binary.Write failed:", err)
    }
    fmt.Println(buf.Bytes()) // Output: [0x10 0x27 0x00 0x00]
}

위 코드는 int32 유형 변수 i를 값 10000으로 바이트 순서가 리틀 엔디안인 바이트 스트림 [0x10, 0x27, 0x00, 0x00]으로 인코딩합니다.

  1. 빅엔디안 변환

위의 바이너리 디코딩 및 인코딩 외에도 "인코딩/바이너리" 패키지는 바이트 순서 변환을 위한 두 가지 기능인 BigEndian과 LittleEndian도 제공합니다.

"BigEndian"은 네트워크 바이트 순서(빅 엔디안)로 데이터 유형을 인코딩 및 디코딩하는 반면, "LittleEndian"은 리틀 엔디안 순서로 데이터 유형을 인코딩 및 디코딩합니다. 예:

func main() {
    var i int32 = 10000
    buf := new(bytes.Buffer)
    binary.Write(buf, binary.BigEndian, i)
    fmt.Println(buf.Bytes()) // Output: [0x27 0x10 0x00 0x00]

    buf.Reset()
    binary.Write(buf, binary.LittleEndian, i)
    fmt.Println(buf.Bytes()) // Output: [0x10 0x27 0x00 0x00]
}

위 코드는 int32 유형 변수 i를 빅 엔디안과 리틀 엔디안 순서로 인코딩하며, 출력 바이트 스트림은 각각 [0x27, 0x10, 0x00, 0x00] 및 [0x10, 0x27, 0x00, 0x00]입니다.

요약

Golang의 "인코딩/바이너리" 패키지는 바이너리 디코딩 및 인코딩, 크고 작은 엔디안 변환 등을 포함하여 바이트 순서 변환을 위한 풍부한 기능을 제공합니다. 이러한 기능을 사용하면 개발자는 쉽게 엔디안 변환을 수행하고 멀티바이트 데이터의 저장 및 전송을 쉽게 처리할 수 있습니다.

위 내용은 golang 바이트 순서 변환의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.