【问题标题】:simple parity bit scheme简单奇偶校验位方案
【发布时间】:2020-09-25 13:49:44
【问题描述】:

我正在尝试在 PyCharm 中创建一个简单的 paritybit 方法,并且我已经编写了以下代码:

import bitarray as ba       # Library with bit strings

data = ba.bitarray(endian = 'little')       # String for data
data.frombytes('Secret message!'.encode())  # String for encoded EDC bits

def parity(bitarray):
    print("Original:\t\t\t{}".format(bitarray))
    #even = True                                        # Two protocols agree on either even or odd
    pbit = '0'                                          # Initiate parity bit as 0
    count = bitarray.count('1')                         # Count the number of ones
    print("Counted {} 1's in bitarray".format(count))
    if (count % 2) != 0:
        pbit = '1'                                      # If the bit array have an odd number of 1's we add parity bit 1 to make the number of 1's even
    print("Parity bit is {}".format(pbit))
    bitarray.append(pbit)
    print("Parity bitarray: \t{}".format(bitarray))
    return bitarray

parity(data)

我得到这个输出:

Original:        bitarray('110010101010011011000110010011101010011000101110000001001011011010100110110011101100111010000110111001101010011010000100')
Counted 58 1's in bitarray
Parity bit is 0
Parity bitarray: bitarray('1100101010100110110001100100111010100110001011100000010010110110101001101100111011001110100001101110011010100110100001001')

如您所见,1 的数量是偶数,奇偶校验位是 0,但是我的代码在位数组的末尾添加了 1 而不是 0。我试图解决这个问题,但我还没找到解决办法。

【问题讨论】:

  • 仍在弄清楚核心问题是什么,但第一个if 是多余的,并且从未使用过even
  • 无法重现。最初我得到'str' object has no attribute 'append',所以您的示例代码不完整,但是在制作data 一个列表后它可以工作,并且0 被打印为“奇偶校验”,然后附加。将数据中的任何0 更改为1(或反向)后,它也能正常工作。
  • 我忘记包含我用作输入的对象类型。我现在已经编辑了示例代码。

标签: python parity


【解决方案1】:

问题在于将'0' 和/或'1' 分配给奇偶校验位pbit

似乎这些字符串都被解释为二进制字符串。如果您将整数值 01 用于 pbit,则您的代码有效:

def parity(bitarray):
    print("Original:\t\t\t{}".format(bitarray))
    pbit = 0 # Updated line
    count = bitarray.count('1')
    print("Counted {} 1's in bitarray".format(count))
    if (count % 2) != 0:
        pbit = 1 # Updated line
    print("Parity bit is {}".format(pbit))
    bitarray.append(pbit)
    print("Parity bitarray: \t{}".format(bitarray))
    return bitarray

这可能是bitarray 模块中的一个错误,因为字符串似乎在其他地方也可以工作,例如在.count() 方法中,但我对bitarray 的了解还不够,无法肯定地说.

另外,特别是考虑到pbit 需要是一个整数,直接使用表达式pbit = count % 2 分配一次会更容易,即:

def parity(bitarray):
    count = bitarray.count('1')
    pbit = count % 2
    bitarray.append(pbit)
    return bitarray

【讨论】:

    猜你喜欢
    • 2015-06-29
    • 1970-01-01
    • 2015-04-04
    • 2014-03-06
    • 1970-01-01
    • 2012-04-20
    • 2017-03-01
    • 2016-01-31
    相关资源
    最近更新 更多