:¿Cómo puedo convertir una cadena terminada en nulo en un buffer de byte a una cadena en Go? Este
label := string([]byte{97, 98, 99, 0, 0, 0, 0})
fmt.Printf("%s\n", label)
hace esto (^@
es la nula bytes):
go run test.go
abc^@^@^@
:¿Cómo puedo convertir una cadena terminada en nulo en un buffer de byte a una cadena en Go? Este
label := string([]byte{97, 98, 99, 0, 0, 0, 0})
fmt.Printf("%s\n", label)
hace esto (^@
es la nula bytes):
go run test.go
abc^@^@^@
usar el paquete strings
.
package main
import (
"fmt"
"strings"
)
func main() {
label := string([]byte{97, 98, 99, 0, 0, 0, 0})
fmt.Println(strings.TrimSpace(label))
}
He usado 'strings.TrimRight (label," \ x00 ")', ¡gracias! – knarf
Tenga en cuenta que la primera respuesta solo funcionará con cadenas que solo tienen una ejecución de ceros después del terminador nulo; sin embargo, una secuencia terminada en nulo de estilo C termina en el primer \0
, incluso si va seguida de basura. Por ejemplo, []byte{97,98,99,0,99,99,0}
deben ser analizados como abc
, no abc^@cc
.
para analizar adecuadamente, utilice string.Index
, de la siguiente manera, para encontrar el primera\0
y lo utilizan para cortar el original bytes cortes:
package main
import (
"fmt"
"strings"
)
func main() {
label := []byte{97,98,99,0,99,99,0}
s := label[:strings.Index(string(label), "\x00")]
fmt.Println(string(s))
}
EDIT: Fue la impresión de la versión abreviada como []byte
en lugar de como string
. Gracias a @serbaut por la captura.
Hay una función oculta en el interior del paquete de llamada al sistema de Go que encuentra el primer byte nulo ([] bytes {0}) y devuelve la longitud. Supongo que se llama clen para C-Length.
Siento un año de retraso en la respuesta, pero creo que es mucho más simple que los otros dos (no hay importaciones innecesarias, etc.)
func clen(n []byte) int {
for i := 0; i < len(n); i++ {
if n[i] == 0 {
return i
}
}
return len(n)
}
Así,
label := []byte{97, 98, 99, 0, 0, 0, 0}
s := label[:clen(label)]
fmt.Println(string(s))
lo que dice^es fijar s
a la división de bytes en label
desde el principio hasta el índice de clen(label)
.
El resultado sería abc
con una longitud de 3.
Esta es la solución más limpia, simple y eficiente. –
Y, a diferencia de la respuesta 'string.Index', esto no va a entrar en pánico si el proporcionado [] byte'' * no * contiene un byte cero. –
La primera respuesta no funcionará !!
func TrimSpace(s []byte) []byte {
return TrimFunc(s, unicode.IsSpace)
}
func IsSpace(r rune) bool {
// This property isn't the same as Z; special-case it.
if uint32(r) <= MaxLatin1 {
switch r {
case '\t', '\n', '\v', '\f', '\r', ' ', 0x85, 0xA0:
return true
}
return false
}
return isExcludingLatin(White_Space, r)
}
no hay "\ x00" en func IsSpace en absoluto.
me gustó el título de la pregunta por elaboración. Sin embargo, me decepcionó el contenido textual de las preguntas. (Sin embargo, proporciona un código útil, te lo daré). – Kissaki