Maison  >  Article  >  développement back-end  >  Comment convertir Go []byte en nombres entiers signés Little/Big-Endian ou en nombres à virgule flottante ?

Comment convertir Go []byte en nombres entiers signés Little/Big-Endian ou en nombres à virgule flottante ?

DDD
DDDoriginal
2024-10-30 07:42:02472parcourir

 How to Convert Go []byte to Little/Big-Endian Signed Integer or Floating-Point Numbers?

Comment convertir Go []byte en entier signé Little/Big-Endian ou Float ?

Lorsqu'il s'agit de données binaires, c'est crucial comprendre le concept d'endianité, qui fait référence à la manière dont les valeurs numériques multi-octets sont stockées en mémoire. Le package binaire de Go fournit des fonctions pratiques pour la conversion entre les types entiers non signés big-endian et small-endian comme Uint16 et Uint32. Cependant, il ne prend pas en charge directement les nombres entiers signés et les nombres à virgule flottante.

La clé pour surmonter cette limitation est d'aborder la tâche en deux étapes :

  1. Assembler la valeur numérique dans l'ordre des octets souhaité en utilisant BigEndian ou LittleEndian.
  2. Interprétez les octets résultants comme un entier signé ou un type flottant approprié.

Conversion en entiers signés

Pour interpréter un uint16 comme un int16 signé, par exemple, utilisez simplement une conversion de type, car ils partagent la même disposition de mémoire :

<code class="go">a := binary.LittleEndian.Uint16(sampleA)
a2 := int16(a)</code>

Des principes similaires s'appliquent aux types entiers signés plus grands comme int64.

Conversion en nombres à virgule flottante

Bien que la conversion d'entiers non signés en types à virgule flottante ne puisse pas être effectuée directement via une conversion de type, le package mathématique de Go fournit des fonctions spécialement conçues à cet effet. but. Ces fonctions vous permettent de convertir des entiers non signés en flottants et vice versa sans altérer la représentation de la mémoire sous-jacente :

<code class="go">a := binary.LittleEndian.Uint64(sampleA)
a2 := math.Float64frombits(a)
// To convert back to unsigned integer:
a3 := math.Float64bits(a2)</code>

Alternative utilisant binaire.Read() et Write()

Les fonctions binaires.Read et Write de Go peuvent être utilisées pour effectuer ces conversions plus efficacement en accédant directement à la représentation de la mémoire sous-jacente. Consultez l'exemple ci-dessous :

<code class="go">pi := float64(3.141592653589793)
buf := new(bytes.Buffer)
binary.Write(buf, binary.LittleEndian, &pi)

var result float64
binary.Read(buf, binary.LittleEndian, &result)
fmt.Println(result)</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!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn