python - C 函数到 Python(不同的结果)

标签 python bit-manipulation lfsr

我正在尝试将这段代码从 C 移植到 python。即使是相同的代码,输出也不同。

这是有效代码的 C 版本:

int main(void)
{

uint8_t pac[] = {0x033,0x55,0x22,0x65,0x76};
uint8_t len = 5;
uint8_t chan = 0x64;

btLeWhiten(pac, len, chan);

    for(int i = 0;i<=len;i++)
    {
        printf("Whiten %02d \r\n",pac[i]);
     }

   while(1)
   {    

   }

  return 0;
  }



void btLeWhiten(uint8_t* data, uint8_t len, uint8_t whitenCoeff)
{

uint8_t  m;

while(len--){   
    for(m = 1; m; m <<= 1){

        if(whitenCoeff & 0x80){

            whitenCoeff ^= 0x11;
            (*data) ^= m;
        }
        whitenCoeff <<= 1;

    }
    data++;
  }
}

我目前在 Python 中拥有的是:

def whiten(data, len, whitenCoeff):
    idx = len 
    while(idx > 0):
        m = 0x01
        for i in range(0,8):
            if(whitenCoeff & 0x80):
                whitenCoeff ^= 0x11
                data[len - idx -1 ] ^= m
                whitenCoeff <<= 1 
                m  <<= 0x01

        idx = idx - 1


pac = [0x33,0x55,0x22,0x65,0x76]
len = 5
chan = 0x64

def main():

whiten(pac,5,chan)
print pac


if __name__=="__main__":
    main()

我看到的问题是 whitenCoeff 在 C 代码段中始终保持 8 位,但在每次循环传递时它在 Python 中变得大于 8 位。

最佳答案

你还有一些问题。

  1. whitenCoeff <<= 1;if 之外阻止您的 C 代码,但它位于 if 中阻止您的 Python 代码。
  2. data[len - idx -1 ] ^= m翻译不正确,它从 C 代码向后工作。

此代码产生与您的 C 代码相同的输出:

def whiten(data, whitenCoeff):
    for index in range(len(data)):
        for i in range(8):
            if (whitenCoeff & 0x80):
                whitenCoeff ^= 0x11
                data[index] ^= (1 << i)

            whitenCoeff = (whitenCoeff << 1) & 0xff

    return data

if __name__=="__main__":
    print whiten([0x33,0x55,0x22,0x65,0x76], 0x64)

关于python - C 函数到 Python(不同的结果),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39337652/

相关文章:

c - 如何将字符串存储到位以减少内存占用

java - 16 位 char 值中的第 6 位在哪里?

c 位操作(字节序)

haskell - LFSR 实现中的高效位摆弄

python - 根据值差异放置在相同的行附近

python - 从 python 连接 oracle 的 jdbc 驱动程序

python - secret 圣诞老人计划

javascript - 无法从 Django 项目中的 Angular 路由加载模板