Conversion de tableaux d'octets en entiers signés et 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 selon les 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 Flotteurs
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 :
<code class="go">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</code>
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!