Conversion de tableaux d'octets en entiers signés et en flottants dans Go
Dans Go, le package binaire offre des fonctions pour convertir des entiers non signés à partir de []byte tableaux, tels que binaire.LittleEndian.Uint16() et binaire.BigEndian.Uint32(). Cependant, il n'existe pas d'équivalents directs pour les entiers signés ou les flottants.
Raison de l'absence de fonctions de conversion d'entiers signés
L'absence de fonctions de conversion d'entiers signés est principalement due au fait qu'interpréter une représentation binaire comme une valeur signée ou non signée est une question de logique de programmation. Le tableau []byte lui-même ne contient que des données binaires brutes, qui peuvent être interprétées comme signées ou non signées en fonction des exigences de l'application.
Comment convertir en entiers signés
Pour convertir une valeur entière non signée en un entier signé, une simple conversion de type peut être utilisée. Étant donné que la disposition de la mémoire des entiers non signés et signés de même taille est identique, la conversion de a de uint16 en int16 à l'aide de int16(a) conservera la représentation binaire d'origine tout en attribuant le signe approprié.
Conversion en Floats
La conversion d'entiers non signés en flottants nécessite un peu plus d'implication. Le package math fournit des fonctions à cet effet : math.Float32frombits() et math.Float64frombits(). À l'inverse, math.Float32bits() et math.Float64bits() peuvent être utilisés pour obtenir la représentation entière non signée des valeurs flottantes.
Utilisation de Binary.Read() et Binary.Write()
Le package binaire comprend également les fonctions Read() et Write() qui peuvent effectuer ces conversions plus efficacement sous le capot. Ces fonctions vous permettent de lire directement une valeur saisie sans avoir besoin de conversions de type intermédiaires.
Exemple d'utilisation de Binary.Read() pour la conversion flottante
Considérez ce qui suit exemple :
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
Clause de non-responsabilité: Toutes les ressources fournies proviennent en partie d'Internet. En cas de violation de vos droits d'auteur ou d'autres droits et intérêts, veuillez expliquer les raisons détaillées et fournir une preuve du droit d'auteur ou des droits et intérêts, puis l'envoyer à l'adresse e-mail : [email protected]. Nous nous en occuperons pour vous dans les plus brefs délais.
Copyright© 2022 湘ICP备2022001581号-3