-- Reads integers, swaps nibbles, and extracts and prints characters -- Uses a packed array of Nibbles to swap the Nibbles with Ada.Text_IO; use Ada.Text_IO; with Ada.Integer_Text_IO; use Ada.Integer_Text_IO; with Ada.Unchecked_Conversion; procedure decoding2b is type bit is mod 2; type Nibble is mod 2 ** 4; type Nibble_Array is array(Natural range <>) of Nibble with pack; subtype Nibble_Array8 is Nibble_Array(1 .. 8); subtype String4 is String(1 .. 4); function rev(s: String) return String is ans: String(s'range); begin for i in s'range loop ans(i) := s(s'first + s'last - i); -- last shall be first end loop; return ans; end rev; function swap_nibbles(n: Nibble_Array8) return Nibble_Array8 is ( n(2) & n(1) & n(4) & n(3) & n(6) & n(5) & n(8) & n(7)); function int_to_Nibble_Array8 is new ada.Unchecked_Conversion (source => Integer, target => Nibble_Array8); function Nibble_Array8_to_string4 is new ada.Unchecked_Conversion (source => Nibble_Array8, target => String4); i: Integer; m, n: Nibble_Array8; s: String4; begin while not end_of_file loop get(i); m := int_to_Nibble_Array8(i); n := swap_nibbles(m); s := Nibble_Array8_to_string4(n); put(rev(s)); end loop; end decoding2b;