Conversión de matrices de bytes en enteros con signo y flotantes en Go
En Go, el paquete binario ofrece funciones para convertir enteros sin signo de []byte matrices, como binario.LittleEndian.Uint16() y binario.BigEndian.Uint32(). Sin embargo, no existen equivalentes directos para enteros con signo o flotantes.
Razón de la ausencia de funciones de conversión de enteros con signo
La ausencia de funciones de conversión de enteros con signo se debe principalmente al hecho de que interpretar una representación binaria como un valor con o sin signo es una cuestión de lógica de programación. La matriz de []bytes en sí contiene solo datos binarios sin procesar, que pueden interpretarse como con o sin signo según los requisitos de la aplicación.
Cómo convertir a enteros con signo
Para convertir un valor entero sin signo en un entero con signo, se puede utilizar una conversión de tipo simple. Dado que el diseño de la memoria de los enteros sin signo y con signo del mismo tamaño es idéntico, al convertir a de uint16 a int16 usando int16(a) se conservará la representación binaria original mientras se asigna el signo apropiado.
Convertir a Flotantes
La conversión de enteros sin signo a flotantes requiere un poco más de participación. El paquete matemático proporciona funciones para este propósito: math.Float32frombits() y math.Float64frombits(). Por el contrario, math.Float32bits() y math.Float64bits() se pueden utilizar para obtener la representación entera sin signo de valores flotantes.
Uso de Binary.Read() y Binary.Write()
El paquete binario también incluye funciones Read() y Write() que pueden realizar estas conversiones de manera más eficiente internamente. Estas funciones le permiten leer directamente un valor escrito sin la necesidad de conversiones de tipo intermedias.
Ejemplo de uso de Binary.Read() para conversión flotante
Considere lo siguiente ejemplo:
b := []byte{0x18, 0x2d, 0x44, 0x54, 0xfb, 0x21, 0x09, 0x40}
var pi float64
buf := bytes.NewReader(b)
err := binary.Read(buf, binary.LittleEndian, &pi)
if err != nil {
fmt.Println("binary.Read failed:", err)
}
fmt.Println(pi) // Output: 3.141592653589793
Descargo de responsabilidad: Todos los recursos proporcionados provienen en parte de Internet. Si existe alguna infracción de sus derechos de autor u otros derechos e intereses, explique los motivos detallados y proporcione pruebas de los derechos de autor o derechos e intereses y luego envíelos al correo electrónico: [email protected]. Lo manejaremos por usted lo antes posible.
Copyright© 2022 湘ICP备2022001581号-3