python 实现 CRC 冗余码的方法
- 我这里考虑输入是
torch.Tensor 的一个 只包含0 ,1 元素的张量 - 对于输入是numpy或者0,1字符串的方法就更简单了,总之都先要将输入处理成为 0,1字符串,例如
“1010” - 首先构造一个输入:
import random
a = [1 for i in range(16)]
b = [0 for i in range(16)]
a.extend(b)
random.shuffle(a)
a = np.array(a)
a = torch.Tensor(a)
a = str(a.numpy().tolist())[1:-1].replace('.0','').replace(',','').replace(' ','')
def add_crc(wm):
a = bytes(full_wm, encoding='utf-8')
print(f"{len(a)}:{a}")
a = binascii.crc32(a)
a = bin(a)
a = str(a)[2:]
padding = 32-len(a)
for i in range(padding):
a = '0'+a
print(f"{len(a)}:{a}")
crc = torch.Tensor([int(i) for i in a])
return torch.cat([wm,crc],dim=0)
def verify_crc(wm):
full_wm = str(wm.numpy().tolist())[1:-1].replace('.0','').replace(',','').replace(' ','')
wm = full_wm[:-32]
crc = full_wm[-32:]
a = bytes(wm, encoding='utf-8')
a = binascii.crc32(a)
if a == int(crc,2):
return True
else:
return False
a = add_crc(a)
print(a)
results = verify_crc(a)
print(results)
32:b'00110110101100011011110000001011'
32:10011010000011110000000001101111
tensor([0., 0., 1., 1., 0., 1., 1., 0., 1., 0., 1., 1., 0., 0., 0., 1., 1., 0.,
1., 1., 1., 1., 0., 0., 0., 0., 0., 0., 1., 0., 1., 1., 1., 0., 0., 1.,
1., 0., 1., 0., 0., 0., 0., 0., 1., 1., 1., 1., 0., 0., 0., 0., 0., 0.,
0., 0., 0., 1., 1., 0., 1., 1., 1., 1.])
True
-
可以看到最后一行,校验成功 -
加入扰动测试 CRC 校验
a = add_crc(a)
print(a)
a[12:15] = 0.
results = verify_crc(a)
print(results)
32:b'00000010100101011011011110010111'
32:01000000100001101101001011110100
tensor([0., 0., 0., 0., 0., 0., 1., 0., 1., 0., 0., 1., 0., 1., 0., 1., 1., 0.,
1., 1., 0., 1., 1., 1., 1., 0., 0., 1., 0., 1., 1., 1., 0., 1., 0., 0.,
0., 0., 0., 0., 1., 0., 0., 0., 0., 1., 1., 0., 1., 1., 0., 1., 0., 0.,
1., 0., 1., 1., 1., 1., 0., 1., 0., 0.])
False
|