Maison > développement back-end > Golang > le corps du texte

Comment convertir entre big et small endian en golang

PHPz
Libérer: 2023-04-24 15:20:00
original
1279 Les gens l'ont consulté

Dans les ordinateurs, l'ordre des octets du processeur est divisé en deux types : Big-Endian et Little-Endian. L'ordre des octets big-endian stocke l'octet de poids le plus élevé à l'adresse mémoire la plus basse et l'octet de poids le plus faible à l'adresse mémoire la plus élevée, tandis que l'ordre des octets small-endian fait le contraire, stockant l'octet le plus bas à l'adresse mémoire la plus basse et la plus élevée ; octet à l’adresse mémoire la plus élevée. Les sections sont enregistrées à l’adresse mémoire la plus élevée.

Golang propose des méthodes pratiques pour convertir entre big endian et little endian. Cet article présentera les méthodes de conversion grand et petit endian dans Golang.

Méthode d'implémentation

Méthode conventionnelle

Dans Golang, vous pouvez utiliser certaines fonctions pour réaliser la conversion de l'ordre des octets. Par exemple, le package encoding/binary fournit les fonctions suivantes : encoding/binary 包中提供了以下函数:

  • binary.BigEndian.Uint16
  • binary.BigEndian.Uint32
  • binary.BigEndian.Uint64
  • binary.BigEndian.PutUint16
  • binary.BigEndian.PutUint32
  • binary.BigEndian.PutUint64

这些函数可以将一个原始类型的数据值转换为大端字节序或从大端字节序转换回原始类型的数据值。

同时,encoding/binary 包也提供了与以上函数类似的小端字节序函数:

  • binary.LittleEndian.Uint16
  • binary.LittleEndian.Uint32
  • binary.LittleEndian.Uint64
  • binary.LittleEndian.PutUint16
  • binary.LittleEndian.PutUint32
  • binary.LittleEndian.PutUint64

这些函数可以将一个原始类型的数据值转换为小端字节序或从小端字节序转换回原始类型的数据值。

假设我们有一个 uint16 类型的整数值,想要将其从大端字节序转换为小端字节序。这时我们可以使用以下代码实现:

var big uint16 = 0x1234
var little uint16 = binary.LittleEndian.Uint16([]byte{byte(big >> 8), byte(big)})
Copier après la connexion

同样,如果我们想将一个 uint16 类型的整数值从小端字节序转换为大端字节序,可以使用以下代码:

var little uint16 = 0x1234
var big uint16 = binary.BigEndian.Uint16([]byte{byte(little >> 8), byte(little)})
Copier après la connexion

优化方式

在实现字节序转换的过程中,我们可以针对不同类型的数据使用不同的优化方法,以提高性能。

  • 小于等于 2 字节的数据类型:对于这种类型的数据,我们可以直接进行位运算,而不必使用 encoding/binary 包中的函数。例如,如果我们想要将一个 uint16 类型的整数值从大端字节序转换为小端字节序,可以使用以下代码:

    var big uint16 = 0x1234 
    var little uint16 = (big << 8) | (big >> 8)
    Copier après la connexion
  • 大于 2 字节的数据类型:对于这种类型的数据,我们可以通过使用 unsafe.Pointerreflect 包提供的工具来进行转换,以提高性能。例如,如果我们想要将一个 uint32 类型的整数值从大端字节序转换为小端字节序,可以使用以下代码:

    value := uint32(0x12345678)
    var arr [4]byte
    *(*uint32)(unsafe.Pointer(&arr[0])) = value
    reflect.Reverse(reflect.ValueOf(arr[:]).Slice(0, 4))
    little := *(*uint32)(unsafe.Pointer(&arr[0]))
    Copier après la connexion
    • uint32 类型的数据值 value 转换为字节数组 arr
    • 利用 reflect 包中的工具函数 Reverse 对字节数组 arr 进行反转,使之从大端字节序转换为小端字节序。
    • 将字节数组 arr 转换为 uint32 类型的数据值 little

总结

本文介绍了 Golang 中实现大小端转换的两种方式:常规方式和优化方式。常规方式通过 encoding/binary

  • binary.BigEndian.Uint16
  • binary .BigEndian .Uint32
  • binary.BigEndian.Uint64
  • binary.BigEndian.PutUint16
  • binary.BigEndian.PutUint32
  • binary.BigEndian.PutUint64
Ces fonctions peuvent convertir un type primitif de données Une valeur est convertie vers ou depuis le big-endian vers le type de valeur de données d'origine. 🎜🎜Dans le même temps, le package encoding/binary fournit également des fonctions little-endian similaires aux fonctions ci-dessus : 🎜
  • binary.LittleEndian.Uint16
  • binary.LittleEndian.Uint32
  • binary.LittleEndian.Uint64
  • binaire. LittleEndian .PutUint16
  • binary.LittleEndian.PutUint32
  • binary.LittleEndian.PutUint64
  • 🎜Ces fonctions peuvent convertir une valeur de données d'un type primitif vers ou depuis l'ordre des octets little-endian en un type primitif. 🎜🎜Supposons que nous ayons une valeur entière de type uint16 et que nous souhaitions la convertir de big endian en little endian. À l'heure actuelle, nous pouvons utiliser le code suivant pour réaliser :🎜rrreee🎜De même, si nous voulons convertir une valeur entière de type uint16 de l'ordre des octets little endian à l'ordre des octets big endian, nous pouvons utiliser le code suivant :🎜rrreee🎜Méthode d'optimisation 🎜🎜Dans le processus de mise en œuvre de la conversion endian, nous pouvons utiliser différentes méthodes d'optimisation pour différents types de données afin d'améliorer les performances. 🎜
    • 🎜Type de données inférieur ou égal à 2 octets : Pour ce type de données, nous pouvons effectuer des opérations sur les bits directement sans utiliser les fonctions du package encoding/binary. Par exemple, si nous voulons convertir une valeur entière de type uint16 de big-endian en small-endian, nous pouvons utiliser le code suivant : 🎜rrreee
    • 🎜Types de données supérieurs à 2 octets : Pour ce type de données, nous pouvons les convertir en utilisant les outils fournis par les packages unsafe.Pointer et reflect pour améliorer les performances. Par exemple, si nous voulons convertir une valeur entière de type uint32 de big-endian en small-endian, nous pouvons utiliser le code suivant : 🎜rrreee
      • Change value de type >uint32 est convertie en un tableau d'octets arr.
      • Utilisez la fonction outil Reverse dans le package reflect pour inverser le tableau d'octets arr afin qu'il soit big-endian L'endianité est convertie en petit-boutiste.
      • Convertir un tableau d'octets arr en une valeur de données little de type uint32.
    🎜Résumé🎜🎜Cet article présente deux façons d'implémenter la conversion big-endian dans Golang : la méthode conventionnelle et la méthode optimisée. La méthode conventionnelle est implémentée via les fonctions fournies par le package encoding/binary et est plus lisible ; la méthode optimisée peut améliorer les performances de conversion dans certains scénarios spécifiques. Dans les applications pratiques, il est nécessaire de choisir comment convertir différents types de données. 🎜

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!

source:php.cn
Déclaration de ce site Web
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
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal