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:
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 è:
Verificate a manina e vedrete che è corretto, pertanto grazie a .Net.