Преобразуйте байты массива байтов в биты и сохраните в целочисленном массиве

У меня есть байты в массиве байтов. Мне нужно сохранить битовое значение каждого байта в целочисленном массиве.

Например ,

массив байтов

byte HexToBin[] = {(byte)0x9A, (byte)0xFF,(byte) 0x05,(byte) 0x16};

тогда целочисленный массив должен иметь

a = [10011010111111110000010100010110]

Я попробовал следующий код, где мне удалось напечатать двоичное значение каждого байта (s2), но я не смог сохранить в целочисленном массиве все биты.

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

person user3048644    schedule 15.01.2014    source источник
comment
Во-первых, не начинайте имена переменных с заглавной буквы. Стандартное соглашение Java и C (вне Microsoft), чтобы имена переменных и методов начинались со строчной буквы.   -  person Hot Licks    schedule 15.01.2014
comment
я обновил код   -  person user3048644    schedule 15.01.2014
comment
Далее, использование toBinaryString — это долгий путь. У вас есть byte. Если вы И байт с 0x80 результат будет ненулевым, если бит 0x80 в байте установлен. Вы можете сидеть в цикле, сдвигая маску вправо (с >>) от 0x80 до 0x40 и 0x20.., проверяя каждый бит и устанавливая соответствующий элемент массива в 1 или 0 соответственно.   -  person Hot Licks    schedule 15.01.2014
comment
(И имейте в виду, что 0 имеет числовое значение 48, а 1 имеет числовое значение 49.)   -  person Hot Licks    schedule 15.01.2014
comment
@HotLicks . Можете ли вы привести пример, как замаскировать каждый бит байта в цикле с помощью 0x80.   -  person user3048644    schedule 15.01.2014


Ответы (2)


Предполагается, что он находится внутри цикла n = от 0 до 3

// 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 + 1] = 0;  // Unnecessary since array is inited to zero but good documention
    }
    mask = mask >> 1;
}
person Hot Licks    schedule 15.01.2014
comment
спасибо за код. вместо if(maskResult) должно быть if(maskResult›0) ? во всех битах[8*n + 1] = 0; , должно быть allBits[8*n + i] = 0;. Я опубликую исправленный код в приведенной выше части, не могли бы вы проверить его? .. он работает нормально .. спасибо .. - person user3048644; 15.01.2014
comment
@ user3048644 - Я забыл, что Java требует сравнения там - я работаю в основном с C, где сравнение не требуется. Обновлено для сравнения равным нулю. (Сравнение › 0 тоже работает нормально.) - person Hot Licks; 15.01.2014
comment
@user3048644 user3048644 - И, конечно же, если вы собираетесь включить это, вам лучше объяснить, как это работает. - person Hot Licks; 15.01.2014

Попробуйте System.out.print((char)allBits[b]); или попробуйте объявить allBits как char[], а не int[].

person SilverbackNet    schedule 15.01.2014