WavMark / utils /bin_util.py
my
Add application file
32ca76b
raw
history blame
No virus
3.07 kB
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)