Press "Enter" to skip to content

C# Convertire byte array in int16 array e convertire un numero in stringa binaria

Due operazioni certamente non quotidiane per chi come me si occupa solitamente di database e user interface, ma oggi, Alberto mi ha chiesto un piccolo aiuto con un array di byte e uno strano checksum e per poter fare le verifiche ho dovuto usare entrambe le cose in oggetto. Mi segno come si fa per ritrovarlo alla prossima:

Convertire un byte[] in uno short[] (o int16[]) ma sarebbe lo stesso con int32 o int64:
private short[] GetShortArray(byte[] pBaits)
{
    int length = pBaits.Length / 2 + pBaits.Length % 2;
    short[] ret = new short[length];
    int j = 0;
    for (int i = 0; i < pBaits.Length; i += 2)
    {
        ret[j] = BitConverter.ToInt16(pBaits, i);
        j++;
    }
    return (ret);
}

Ovviamente per gli int32 si deve spostarsi di 4 byte, per gli int64 di 8 byte e così via.

short[] pippo = new short[] { 100, 156, 234, 322 };
byte[] pluto = new byte[pippo.Length * 2];
int j = 0;
for (int i = 0; i < pippo.Length; i++)
{
    byte[] pezzo = BitConverter.GetBytes(pippo[i]);
    pluto[j] = pezzo[0];
    j++;
    pluto[j] = pezzo[1];
    j++;
}

short[] resultShort = GetShortArray(pluto);

Il programmino becero qui sopra fa un test con questo risultato:

convertino_02_2 

Ovviamente ci sono modi + eleganti di procedere all’estrazione dei byte  e se i byte vi arrivano da una seriale già in riga potete convertirli velocemente come è successo a me.

Convertire un numero in una stringa in formato binario:

Se vi dovesse necessitare esaminare un numero intero o un byte per fare un Or oppure uno Xor, il metodo migliore è verificare i bit che lo compongono, ovviamente c’è la calcolatrice scientifica di windows, grazie al cielo, ma se ne avete un array intero è lungo quindi ecco come fare in C#:

private string GetBitString(byte pVal)
{
    return (Convert.ToString(pVal, 2));
}

private string GetOctalString(byte pVal)
{
    return (Convert.ToString(pVal, 8));
}

Come vedete ho fatto due metodi solo per mostrare che il secondo parametro è la base in cui rappresentare il numero, pertanto 2 per un numero binario, 8 per un ottale, 16 per un esadecimale e così via. Il risultato del mio test è:

convertino_01_2 

Verificate a manina e vedrete che è corretto, pertanto grazie a .Net.