def hide(self, bin_data, order_num=0, bad_bits_num=1): bin_data = pack(">L", len(bin_data)) + bin_data if len(bin_data) > self.container_space(bad_bits_num): raise ContainerException("Too much data to hide. {}: but max={}".format( len(bin_data), self.container_space()) ) order_inspector = ORDER_INSPECTORS[order_num](self.container_space()) sample_id = 0 pos = 0 hidden_data_byte = 0 bits_data = byte_tools.to_bits(bin_data) for i in range(len(bits_data)): hidden_data_byte = hidden_data_byte * 2 + bits_data[i] pos += 1 if (pos == bad_bits_num) or (i + 1 == len(bits_data)): if i + 1 == len(bits_data) and not (pos == bad_bits_num): while pos != bad_bits_num: hidden_data_byte *= 2 pos += 1 self[sample_id] = byte_tools.hide_data(self[sample_id], hidden_data_byte, bad_bits_num) pos = 0 hidden_data_byte = 0 sample_id = order_inspector.next()
def test_to_bits(self): b = b'\xff\x01' res = 0 for bit in byte_tools.to_bits(b): res = res * 10 + bit self.assertEqual(1111111100000001, res)
def test_to_bytes(self): first = b'\xff\x01' b = bytes(byte_tools.to_bytes(byte_tools.to_bits(first))) self.assertEqual(first, b)