Boa maneira de converter entre curto e bytes?
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?
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