C函数到Python(不同的结果)
我正在尝试将这段代码从C移植到python。尽管是相同的代码,但输出是不同的 这是代码的C版本,它可以工作: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
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
whitenCoeffwhitenCoeff 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()