[100]byte많은 string데이터 를 전송 하려면 읽어야 합니다 .
모든 strings의 길이가 정확히 100자인 것은 아니기 때문에 의 나머지 부분은 s byte array로 채워집니다 0.
내가 변환하면 [100]byte에 string의해 : string(byteArray[:])의 미행 0들로 표시됩니다 ^@^@의.
C에서이 string해지됩니다 0, 그래서 나는이를 변환하는 가장 좋은 방법은 무엇 궁금 byte array에 stringGolang에서.
답변
바이트 슬라이스로 데이터를 읽는 메소드는 읽은 바이트 수를 리턴합니다. 해당 숫자를 저장 한 다음 문자열을 작성하는 데 사용해야합니다. 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()