У меня есть байты в байтовом массиве. Мне нужно сохранить значение бит каждого байта в целочисленном массиве.Преобразование байтов байтового массива в биты и сохранение в массиве Integer
Например,
массив байт
byte HexToBin[] = {(byte)0x9A, (byte)0xFF,(byte) 0x05,(byte) 0x16};
то целочисленный массив должен иметь
a = [10011010111111110000010100010110]
Я попытался следующий код, где я был в состоянии напечатать двоичный значение каждого байта (s2), но я не мог хранить в целочисленном массиве allBits.
byte hexToBin[] = {(byte)0x9A, (byte)0xFF,(byte) 0x05,(byte) 0x16};
int[] allBits = new int[32];
int a =0;
for (int i =0; i < hexToBin.length ; i++)
{
byte eachByte = hexToBin[i];
String s2 = String.format("%8s", Integer.toBinaryString((eachByte)& 0xFF)).replace(' ', '0');
System.out.println(s2);
char [] totalCharArr = s2.toCharArray();
for (int k=0; k <8; k++)
{
allBits[k+a]= totalCharArr[k];
}
a= a+8;
}
for (int b=0; b<32;b++)
{
System.out.print(allBits[b]);
}
Выход выше код
10011010
11111111
00000101
00010110
4948484949484948494949494949494948484848484948494848484948494948
Целое массив не имеет двоичное значение.
////////////////////////////////////////////// ////////////////////////////////////////////////// ////
Спасибо за помощь
Поправлено код
byte hexToBin[] = {(byte)0x9A, (byte)0xBF,(byte) 0x05,(byte) 0x16};
int[] allBits = new int[32]; // no of bits is determined by the license code
for (int n =0; n<hexToBin.length; n++)
{
//Use ints to avoid any possible confusion due to signed byte values
int sourceByte = 0xFF &(int)hexToBin[n];//convert byte to unsigned int
int mask = 0x80;
for (int i=0; i<8; i++)
{
int maskResult = sourceByte & mask; // Extract the single bit
if (maskResult>0) {
allBits[8*n + i] = 1;
}
else {
allBits[8*n + i] = 0; // Unnecessary since array is initiated to zero but good documentation
}
mask = mask >> 1;
}
}
for (int k= 0; k<32; k++)
{
System.out.print(allBits[k]);
}
Во-первых, не начинайте имена переменных с прописной буквы. Стандартное соглашение Java и C (за пределами Microsoft) для запуска имен переменных и методов с строчной буквой. –
Я обновил код – user3048644
Далее, использование toBinaryString - это длинный путь. У вас есть 'byte'. Если вы и байт с 0x80, результат будет отличным от нуля, если установлен бит 0x80 в байте. Вы можете сидеть в цикле, перемещая «маску» вправо (с помощью '>>') от 0x80 до 0x40 до 0x20 .., тестируя каждый бит и устанавливая соответствующую запись массива в 1 или 0 соответственно. –