Timkor

bits to bytes

Sep 17th, 2021 (edited)
823
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. package com.company;
  2.  
  3. // приклад створення реальних байтів з бітових абстракцій де зберігаємо закодовані послідовністі - далі коди
  4. public class Main {
  5.    
  6.     public static void main(String[] args) {
  7.         // довжина коду (рівнодовгі коди)
  8.         int codeLength = 3;
  9.         // коди можна представити інтами, ми то знаємо що в "душі" вони такі 00000000 00000001 00000010 00000011 ...
  10.         // можна зберігати їх чи в стрінгах, чи в масивах булінів наприклад, як завгодно - а на етапі
  11.         // формування закодованого байту обрана вами абстракція має перетворитися на біти для нього
  12.         int[] codes = {0, 1, 2, 3, 4, 5, 6, 7};         // 000 001 010 011 100 101 110 111
  13.                                                         // 000 001 01                       = 5
  14.                                                         //           0 011 100 1            = 57
  15.                                                         //                      01 110 111  = 119
  16.         // т.я. довжина коду = 3, маска відповідно для взяття трох молодших бітів
  17.         int mask = 0b00000111;  // 7; кількіст включених молодших бітів дорівнює довжині коду. Таку маску можна обчислити:
  18.         int anyCodeLength = 3;  // від довжини кодованої послідовності
  19.         int eMask = ((int) Math.pow(2, anyCodeLength) - 1); // ця формула використовується нижче, тут для пояснення
  20.         System.out.println("the eMask for code length = " + anyCodeLength + " is " + eMask + " (bin:) " + (Integer.toBinaryString(eMask)));
  21.  
  22.         int encodedByte = 0;    // закодований байт, його будемо формувати - заповнювати бітами
  23.         int code = 0;   // поточний код (закодована послідовність)
  24.         // writedBitCount - кількість бітів вже записаних до формуємого байту
  25.         for (int i = 0, writedBitCount = 0; i < codes.length; i++) {
  26.  
  27.             // формуємо зжатий (закодований) байт з кодів, перетворюючи їх на біти в ньому з абстракції де вони зберігалися
  28.             code = codes[i] & mask; // маска що залише лише три молодші біти в коді, як захист від збільшеного коду
  29.             encodedByte <<= codeLength; // зсуваємо вже записане, зправа з'являється місце (біти) для нового коду
  30.             encodedByte |= code; // записуємо поточний код на місце (пусті молодші біти) що з'явилося після зсуву
  31.             writedBitCount += codeLength; // лічильник записаних бітів збільшуємо на розмір записаного (довж.коду)
  32. //            System.out.println("binary encodedByte: " + Integer.toBinaryString(encodedByte));
  33. //            System.out.println("writedBitCount: " + writedBitCount);
  34.  
  35.             // якщо назбирали зжатий байт
  36.             if (writedBitCount >= Byte.SIZE) {
  37.                 writedBitCount -= 8;
  38.                 int overWrited = encodedByte & ((int) Math.pow(2, writedBitCount) - 1); // коли записали більше восьми біт то забираємо
  39.                 // їх (вони молодші - справа) вирахованою хитрою маскою
  40.                 encodedByte >>= writedBitCount;                           // та повертаємось зсувом до 8 бітів
  41.                 System.out.println("ready for use encoded byte: " + (encodedByte & 255));
  42.                 encodedByte = overWrited;                                 // а ті зайві (перезаписані) переносимо до наступного
  43.  
  44.             }
  45.  
  46.             // flush - коли цикл фактично скінчився, але останній байт не повністю сформований, або в акурат сформований
  47.             // та не встигне повернутися (в нашому випадку вивестися до терміналу)
  48.             if ((i == codes.length - 1) && writedBitCount != 0) {
  49.                 System.out.println("ready for use encoded byte: " + ((encodedByte & 255) << (8 - writedBitCount)));
  50.             }
  51.  
  52.         }
  53.     }
  54. }
  55.  
RAW Paste Data