Question

Je dois prendre des paires d'octets et des courts-métrages en sortie, ainsi que des paires d'octets en sortie. Voici les fonctions que j'ai conçues à cette fin:

static short ToShort(short byte1, short byte2)
{
    short number = (short)byte2;
    number <<= 4;
    number += (short)byte1;
    return number;
}
static void FromShort(short number, out byte byte1, out byte byte2)
{
    byte byte2 = (byte)(number >> 4);
    short tempByte = (short)byte2 << 4;
    byte byte1 = (byte)(number - tempByte);
}

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, c'est quoi? y a-t-il un moyen de le faire déjà dans le cadre?

Était-ce utile?

La solution

Version plus courte (décalage de 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);
}

Autres conseils

Utilisez BitConverter

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

Les octets sont 8 bits et non 4, votre décalage est donc désactivé. Vous avez également déclaré des variables locales dans la deuxième fonction pour ne pas écrire les paramètres out comme vous le souhaitez. C’est aussi plus clair / mieux si vous vous limitez aux opérations au niveau des bits ( & amp; , | et ~ ), si 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);
}

Notez que les décalages gauche et droit de zéro ne sont pas nécessaires, à proprement parler. Je viens de mettre ceux-ci pour la symétrie. De plus, personnellement, je vous recommanderais d’apprendre le froid arithmétique au niveau des bits et d’éviter les fonctions d’aide à l’écriture comme celles-ci. Pas besoin de cacher les détails avec quelque chose d'aussi fondamental, IMHO.

Si vous voulez prendre des octets ... prenez des octets; et vos équipes sont désactivées, et | serait plus intuitif:

static short ToShort(byte byte1, byte byte2)
{   // using Int32 because that is what all the operations return anyway...
    return (short)((((int)byte1) << 8) | (int)byte2);
}
static void FromShort(short number, out byte byte1, out byte byte2)
{
    byte1 = (byte)(number >> 8); // to treat as same byte 1 from above
    byte2 = (byte)number;
}

Convertisseur System.Bit

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top