Guter Weg zwischen kurzen und Bytes zu konvertieren?
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?
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