10
votes

Bon moyen de convertir entre courts et octets?

J'ai besoin de prendre des paires d'octets et de sortir des shorts et de prendre un short dans et de sortir des paires d'octets. Voici les fonctions que j'ai conçues pour un tel but: xxx

Je pense que c'est correct mais je ne suis pas sûr. Si ce n'est pas la bonne façon de le faire, quel est? Y a-t-il un moyen de le faire déjà dans le cadre?


2 commentaires

Vous devez changer de 8 bits, pas 4.


Voici des choses intéressantes ici est que dans Toport BYTE1 est le MSB (c'est-à-dire celui de gauche), où, comme dans Dubrehort byte1 est le LSB (c'est-à-dire celui de la droit). Je les ai changées dans ma réponse ;-p


5 Réponses :


5
votes

octets sont de 8 bits, pas 4, donc votre changement de vitesse est éteint. Vous avez également déclaré variables locales dans la deuxième fonction afin que vous ne puissiez pas finir par écrire les paramètres out> comme vous l'intention. Il est également plus clair / meilleur si vous vous limitez à des opérations bitwises ( & code>, | code> et ~ code>) dans la mesure du possible.

static short ToShort(byte byte1, byte byte2)
{
    return (short) ((byte2 << 8) | (byte1 << 0));
}

static void FromShort(short number, out byte byte1, out byte byte2)
{
    byte2 = (byte) (number >> 8);
    byte1 = (byte) (number >> 0);
}


2 commentaires

C'est la seule solution que je recommanderais.


Ceci est la seule solution correcte pour la signature courte signée



24
votes

version plus courte (évoquant également 8 bits au lieu de 4):

static short ToShort(short byte1, short byte2)
{
    return (byte2 << 8) + byte1;
}

static void FromShort(short number, out byte byte1, out byte byte2)
{
    byte2 = (byte)(number >> 8);
    byte1 = (byte)(number & 255);
}


5 commentaires

J'ai dû envelopper le code dans la méthode Toshort avec un casting en short, il suffit de penser que je vous le ferais savoir ...


Cela ne compile pas ... pourquoi tant de upvotes? Short + Courts résolves à un opérateur entier et ne peut pas mettre implicitement in int comme court


@Assimilater dans quel compilateur?


Compilateur Microsoft Visual C # Ciblage .Netv4.5.2 ... Cela dépend-il de la version ?NET?


La coulée est une courte nécessité dans toshort juste avant de retourner. Voir la réponse par @ John-Kugelman



4
votes

Si vous voulez prendre des octets ... Prenez des octets; et vos changements sont éteints et | serait plus intuitif: xxx


3 commentaires

que prenant des octeses était en fait une erreur ... de bons conseils, merci!


Vous voudrez généralement bit byte2, pas byte1. Alors quelque chose comme: retour (court) ((byte2 << 8) | byte1);


Bien que les cases des intves soient inutiles, cela montre ce qui se passera de toute façon (et je pense que c'est ce que vous vouliez dire par le commentaire), donc +1



0
votes

système.bitconverter


5 commentaires

Tant que cela ne vous dérange pas de la surcharge d'un tableau tout le temps, et de ne pas avoir le contrôle de ce que cela soit petit-Endian ou Big-Endian ..


@MARC Gravell Autant que vous contrôlez, vous devrez mettre en logique pour gérer les deux et le droit? identique à l'inverser le tableau droit? Mais je suppose que le tableau serait une légère aérien cependant ...


Au moment où vous avez mis dans une telle logique, vous pouvez également simplement utiliser des arithmétiques bitwises et évité tous les problèmes ... Si vous traitez des conversions d'octets, apprenez un peu de mathématiques est probablement la meilleure réponse; - p


@Mg quand il s'agit de logique de bits, j'aime optimiser pour une logique de bits minimale; ) Mais, je vois ton point!


@Marcgravell cette réponse ... si vide ... Je voudrais levoir, mais c'est d'un utilisateur enlevé de sorte que cela importerait peu ... je voterais pour le supprimer, mais c'est une réponse technique ... Soupir



35
votes

Utilisez Bitconverter

short number = 42;
byte[] numberBytes = BitConverter.GetBytes(number);
short converted = BitConverter.ToInt16(numberBytes);


4 commentaires

HMM n'a pas pensé à cela, mais j'aime la slution des ates pour l'instant. Merci!


Tout ce qui fonctionne le mieux pour vous! L'utilisation de l'utilisation d'une méthode comme celle-ci est que si vous devez utiliser ce code dans d'autres projets, il sera simplement là au lieu de devoir créer une bibliothèque et partager le code. En outre, d'autres développeurs peuvent ré-utiliser leurs connaissances de Bitconverter s'ils en ont. Personnellement, nous avons eu l'habitude d'avoir du code de l'emballage pour les conversions d'octets que nous partagerions, mais il est devenu plus un problème de maintenir plutôt que d'utiliser simplement les trucs intégrés. Mais sérieusement, utilisez ce qui fonctionne le mieux pour vous; )


En tant que programmeur AC / C ++ au cœur, je trouve cela stupide que tout le monde le trouverait chargé de faire un bit-bit et une opération simple ... générer un octet [] , puis cependant bitconverter est implémenté pour analyser ledit octet [] par la suite semble juste idiot ....


Je pense que Bitconverter considérerait les gros scénarios d'Endian / Petits Scénarios Endian.