Pergunta

Eu preciso levar pares de bytes, e calções de saída, e tomar shorts no e pares de bytes de saída. Aqui estão as funções i já concebidas para esse fim a:

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

Eu acho que isso é correto, mas eu não tenho certeza. Se este não é o caminho certo para fazê-lo, o que é? há uma maneira de fazer isso já no quadro?

Foi útil?

Solução

versão mais curta (também deslocando 8 bits em vez 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);
}

Outras dicas

Use BitConverter

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

Bytes são 8 bits, e não 4, portanto, seu deslocamento está desligado. Também declarou variáveis ??locais na segunda função para que você não iria acabar por escrever os parâmetros do out como você pretende. É também mais claro / melhor se você se limitar a bit a bit operações (&, | e ~) sempre que possível.

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

Note que as mudanças esquerdo e direito por zero são desnecessários, estritamente falando. Acabei de colocar aqueles em simetria. Além disso, pessoalmente eu recomendo que você acabou de aprender frio aritmética bit a bit e pular escrever funções auxiliares como estes. Não há necessidade de esconder os detalhes com algo tão fundamental, IMHO.

Se você quer tomar bytes ... take bytes; e suas mudanças estão fora, e | seria mais 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 em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top