[go] 0으로 끝나는 바이트 배열을 문자열로 변환하는 방법은 무엇입니까?

[100]byte많은 string데이터 를 전송 하려면 읽어야 합니다 .

모든 strings의 길이가 정확히 100자인 것은 아니기 때문에 의 나머지 부분은 s byte array로 채워집니다 0.

내가 변환하면 [100]bytestring의해 : string(byteArray[:])의 미행 0들로 표시됩니다 ^@^@의.

C에서이 string해지됩니다 0, 그래서 나는이를 변환하는 가장 좋은 방법은 무엇 궁금 byte arraystringGolang에서.



답변

바이트 슬라이스로 데이터를 읽는 메소드는 읽은 바이트 수를 리턴합니다. 해당 숫자를 저장 한 다음 문자열을 작성하는 데 사용해야합니다. n읽은 바이트 수가 코드이면 다음과 같습니다.

s := string(byteArray[:n])

전체 문자열을 변환하려면 다음을 사용할 수 있습니다.

s := string(byteArray[:len(byteArray)])

이것은 다음과 같습니다.

s := string(byteArray)

어떤 이유로 든 모르는 n경우 bytes입력에 널 문자가 포함되어 있지 않다고 가정하면 패키지를 사용하여 찾을 수 있습니다.

n := bytes.Index(byteArray, []byte{0})

또는 icza가 지적했듯이 아래 코드를 사용할 수 있습니다.

n := bytes.IndexByte(byteArray, 0)


답변

이건 어떤가요?

s := string(byteArray[:])


답변

간단한 솔루션 :

str := fmt.Sprintf("%s", byteArray)

나는 이것이 얼마나 성능이 있는지 잘 모르겠습니다.


답변

예를 들어

package main

import "fmt"

func CToGoString(c []byte) string {
    n := -1
    for i, b := range c {
        if b == 0 {
            break
        }
        n = i
    }
    return string(c[:n+1])
}

func main() {
    c := [100]byte{'a', 'b', 'c'}
    fmt.Println("C: ", len(c), c[:4])
    g := CToGoString(c[:])
    fmt.Println("Go:", len(g), g)
}

산출:

C:  100 [97 98 99 0]
Go: 3 abc


답변

다음 코드는 ‘\ 0’을 찾고 있으며 질문의 가정에 따라 ‘\ 0’이 아닌 모든 ‘\ 0’이 앞에 오므로 배열을 정렬 된 것으로 간주 할 수 있습니다. 배열이 데이터 내에 ‘\ 0’을 포함 할 수 있으면이 가정은 유지되지 않습니다.

이진 검색을 사용하여 첫 번째 0 바이트의 위치를 ​​찾은 다음 슬라이스하십시오.

다음과 같이 0 바이트를 찾을 수 있습니다.

package main

import "fmt"

func FirstZero(b []byte) int {
    min, max := 0, len(b)
    for {
        if min + 1 == max { return max }
        mid := (min + max) / 2
        if b[mid] == '\000' {
            max = mid
        } else {
            min = mid
        }
    }
    return len(b)
}
func main() {
    b := []byte{1, 2, 3, 0, 0, 0}
    fmt.Println(FirstZero(b))
}

특히 대부분의 문자열이 짧은 경우 바이트 배열을 순전히 스캔하여 0 바이트를 찾는 것이 더 빠를 수 있습니다.


답변

배열에서 0이 아닌 바이트의 정확한 길이를 모르는 경우 먼저 트리밍 할 수 있습니다.

문자열 (bytes.Trim (arr, “\ x00”))


답변

왜 안돼?

bytes.NewBuffer(byteArray).String()