2014-01-15 2 views
0

У меня есть байты в байтовом массиве. Мне нужно сохранить значение бит каждого байта в целочисленном массиве.Преобразование байтов байтового массива в биты и сохранение в массиве 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]); 
} 
+0

Во-первых, не начинайте имена переменных с прописной буквы. Стандартное соглашение Java и C (за пределами Microsoft) для запуска имен переменных и методов с строчной буквой. –

+0

Я обновил код – user3048644

+0

Далее, использование toBinaryString - это длинный путь. У вас есть 'byte'. Если вы и байт с 0x80, результат будет отличным от нуля, если установлен бит 0x80 в байте. Вы можете сидеть в цикле, перемещая «маску» вправо (с помощью '>>') от 0x80 до 0x40 до 0x20 .., тестируя каждый бит и устанавливая соответствующую запись массива в 1 или 0 соответственно. –

ответ

1

Принято считать, чтобы быть внутри петли 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; 
} 
+0

Благодарим вас за код. вместо if (maskResult), должно быть if (maskResult> 0)? во всех битах [8 * n + 1] = 0; , он должен быть allBits [8 * n + i] = 0 ;. Я отправлю исправленный код в приведенной выше части, не могли бы вы проверить его? .. он работает отлично .. спасибо .. – user3048644

+0

@ user3048644 - Я забыл, что Java требует сравнения там - я работаю в основном с C, где сравнить не требуется. Обновлено для сравнения равным нулю. (Сравнение> 0 работает хорошо тоже.) –

+0

@ user3048644 - И, конечно, если вы собираетесь это сделать, лучше объясните, как это работает. –

1

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

Смежные вопросы