Frage

Ich brauche Paare von Bytes nehmen in und Ausgabe Shorts und nehmen Shorts in und Ausgangspaare von Bytes. Hier sind die Funktionen i für einen solchen Zweck ausgedacht haben:

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);
}

Ich denke, das ist richtig, aber ich bin nicht sicher. Ist dies nicht der richtige Weg ist, es zu tun, was ist? gibt es eine Möglichkeit, dies bereits im Rahmen zu tun?

War es hilfreich?

Lösung

Kürzere Version (Verschiebung auch 8 Bit anstelle von 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);
}

Andere Tipps

Verwenden Sie BitConverter

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

Bytes sind 8 Bits, nicht mehr als 4, so dass Ihre Verschiebung ausgeschaltet ist. Sie erklärt auch lokale Variablen in der zweiten Funktion, so würden Sie nicht die der out Parameter Schreiben am Ende, wie Sie möchten. Es ist auch klarer / besser, wenn Sie sich selbst begrenzen Operationen bitweise (&, | und ~), soweit möglich.

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);
}
Hinweis

, dass die linken und rechten Verschiebungen von Null nicht notwendig sind, streng genommen. Ich habe nur diejenigen, die in der Symmetrie. Auch ich persönlich würde empfehlen, nur bitweise arithmetische kalt lernen und Schreiben Hilfsfunktionen wie diese überspringen. Keine Notwendigkeit, die Details mit etwas so grundlegend, IMHO zu verbergen.

Wenn Sie möchten, Bytes nehmen ... nehmen Bytes; und Ihre Verschiebungen sind ausgeschaltet, und | wäre intuitiver:

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;
}

System.BitConverter

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top