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