Pregunta

Necesito tomar pares de bytes y generar cortos, y tomar cortos y generar pares de bytes. Estas son las funciones que he diseñado para tal 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);
}

Creo que esto es correcto pero no estoy seguro. Si esta no es la forma correcta de hacerlo, ¿qué es? ¿Hay alguna manera de hacer esto ya en el marco?

¿Fue útil?

Solución

Versión más corta (también cambiando 8 bits en lugar 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);
}

Otros consejos

Utilice BitConverter

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

Los bytes son 8 bits, no 4, por lo que su desplazamiento está desactivado. También declaró variables locales en la segunda función para que no terminara escribiendo los parámetros out como pretendía. También es más claro / mejor si se limita a operaciones bit a bit ( & amp; , | y ~ ) siempre que sea posible.

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

Tenga en cuenta que los desplazamientos a la izquierda y derecha por cero son innecesarios, estrictamente hablando. Solo los puse por simetría. Además, personalmente te recomendaría que solo aprendas funciones aritméticas en frío bit a bit y omitas las funciones de ayuda de escritura como estas. No es necesario ocultar los detalles con algo tan fundamental, en mi humilde opinión.

Si quieres tomar bytes ... toma bytes; y sus turnos están desactivados, y | sería más intuitivo:

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

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top