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

C函数到Python(不同的结果),python,bit-manipulation,lfsr,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 %0

我正在尝试将这段代码从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++;
  }
}
int main(无效)
{
uint8_t pac[]={0x033,0x55,0x22,0x65,0x76};
uint8_t len=5;
uint8_t chan=0x64;
btLeWhiten(pac、len、chan);

对于(int i=0;i,在C中,您将数据从0写入len-1,但在Python中,您将数据从-1写入len-2。从此行中删除-1:

data[len - idx -1 ] ^= m
像这样

data[len - idx] ^= m
如果:

whitenCoeff <<= 1 
whitenCoeff
whitenCoeff 0):
m=0x01
对于范围(0,8)内的i:
如果(whitenCoeff&0x80):
whitenCoeff^=0x11
数据[-idx]^=m

whitenCoeff=(whitenCoeff您还有一些问题


  • whitenCoeff我通过将python代码与0xFF相加来解决这个问题。这样可以防止变量增加超过8位。

    您在
    C
    中的代码似乎无法正常工作,因为它显示的值比
    pac
    中的值多出一个。对此进行更正将导致显示5个值,而不是6个值。要将逻辑从
    C
    复制到
    Python
    ,编写以下代码是为了复制结果:

    #! /usr/bin/env python3
    def main():
        pac = bytearray(b'\x33\x55\x22\x65\x76')
        chan = 0x64
        bt_le_whiten(pac, chan)
        print('\n'.join(map('Whiten {:02}'.format, pac)))
    
    
    def bt_le_whiten(data, whiten_coeff):
        for offset in range(len(data)):
            m = 1
            while m & 0xFF:
                if whiten_coeff & 0x80:
                    whiten_coeff ^= 0x11
                    data[offset] ^= m
                whiten_coeff <<= 1
                whiten_coeff &= 0xFF
                m <<= 1
    
    
    if __name__ == '__main__':
        main()
    
    !/usr/bin/env python3
    def main():
    pac=bytearray(b'\x33\x55\x22\x65\x76')
    chan=0x64
    bt_le_whiten(pac,chan)
    打印('\n'.join(映射('Whiten{:02}'.format,pac)))
    def bt_le_whiten(数据,whiten_系数):
    对于范围内的偏移(长度(数据)):
    m=1
    而m&0xFF:
    如果变白系数为&0x80:
    白化系数^=0x11
    数据[偏移量]^=m
    
    whiten_coeff我有理由相信Python总是使用更大的数字类型(
    int
    ),因此您的Python代码使用不同大小的类型(这可以解释不同的结果)邪恶的事情:您会相信您会受到数组越界的保护,但在这种情况下不会(很好的发现,虽然这不是下一个问题:))这可能就是np数组不支持负指示符的原因DX被初始化为len,递增-1。idx取10,9,8,(len idx)取0,1,2,。。。
    whitenCoeff = (whitenCoeff<<1) & 0xFF
    
    def whiten(data, whitenCoeff):
        idx = len(data)
        while(idx > 0):
            m = 0x01
            for i in range(0,8):
                if(whitenCoeff & 0x80):
                    whitenCoeff ^= 0x11
                    data[-idx] ^= m
                whitenCoeff = (whitenCoeff<<1) & 0xFF
                m  <<= 0x01
    
            idx = idx - 1
    
    
    pac = [0x33,0x55,0x22,0x65,0x76]
    chan = 0x64
    
    def main():
    
        whiten(pac,chan)
        print(pac)
    
    
    if __name__=="__main__":
        main()
    
    for(int i = 0;i<=len;i++)
    
    for(int i = 0;i<len;i++)
    
    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)
    
    #! /usr/bin/env python3
    def main():
        pac = bytearray(b'\x33\x55\x22\x65\x76')
        chan = 0x64
        bt_le_whiten(pac, chan)
        print('\n'.join(map('Whiten {:02}'.format, pac)))
    
    
    def bt_le_whiten(data, whiten_coeff):
        for offset in range(len(data)):
            m = 1
            while m & 0xFF:
                if whiten_coeff & 0x80:
                    whiten_coeff ^= 0x11
                    data[offset] ^= m
                whiten_coeff <<= 1
                whiten_coeff &= 0xFF
                m <<= 1
    
    
    if __name__ == '__main__':
        main()