import numpy as np def hexChar2binStr(v): assert len(v) == 1 # e => '1110' return '{0:04b}'.format(int(v, 16)) def hexStr2BinStr(hex_str): output = [hexChar2binStr(c) for c in hex_str] # ['1110', '1100', ....] return "".join(output) def hexStr2BinArray(hex_str): # 十六进制字符串==> 0,1g构成的数组 tmp = hexStr2BinStr(hex_str) return np.array([int(i) for i in tmp]) def binStr2HexStr(binary_str): return hex(int(binary_str, 2))[2:] def binArray2HexStr(bin_array): tmp = "".join(["%d" % i for i in bin_array]) return binStr2HexStr(tmp) # 判断是否为合法的16进制字符串 def is_hex_str(s): hex_chars = "0123456789abcdefABCDEF" return all(c in hex_chars for c in s) def flip_bytearray(input_bytearray, num_bits_to_flip): tmp = bytearray_to_binary_list(input_bytearray) tmp = flip_array(tmp,num_bits_to_flip) return binary_list_to_bytearray(tmp) def flip_array(input_bits, num_bits_to_flip): # 随机选择要翻转的位的索引 flip_indices = np.random.choice(len(input_bits), num_bits_to_flip, replace=False) # 创建一个全零的掩码数组 mask = np.zeros_like(input_bits) # 将选定的索引设置为 1 mask[flip_indices] = 1 # 将输入位数组与掩码进行逐元素异或运算,实现翻转位 flipped_bits = input_bits ^ mask return flipped_bits def bytearray_to_binary_list(byte_array): binary_list = [] for byte in byte_array: binary_str = format(byte, '08b') # 将字节转换为 8 位二进制字符串 binary_digits = [int(bit) for bit in binary_str] # 将二进制字符串转换为整数列表 binary_list.extend(binary_digits) # 将整数列表添加到结果列表中 return binary_list def binary_list_to_bytearray(binary_list): # 这个函数假设输入列表的长度是 8 的倍数,否则将引发异常。 byte_list = [] for i in range(0, len(binary_list), 8): binary_str = ''.join(str(bit) for bit in binary_list[i:i + 8]) # 将 8 个位连接为一个二进制字符串 byte_value = int(binary_str, 2) # 将二进制字符串转换为整数 byte_list.append(byte_value) # 将整数添加到字节列表中 return bytearray(byte_list) if __name__ == "__main__": # hex_str = "ecd057f0d1fbb25d6430b338b5d72eb2" # arr = hexStr2BinArray(hex_str) # out = binArray2HexStr(arr) # print(out==hex_str) # bin_str = "".join() # assert bin2hex_str(bin_str) == hex_str # print(bin_str, len(bin_str)) # watermark = np.random.randint(2, size=44) res = binArray2HexStr(watermark) print(res) test_str1 = "3ad30c748a2" test_str2 = "3ad30Z748a2" print(is_hex_str(test_str1)) # 输出 True print(is_hex_str(test_str2)) # 输出 False # encode_file("1.wav", watermark) # out = decode_file("tmp_output.wav") # assert np.all(watermark == out)