我正在尝试将这段代码从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位更大。
发布于 2016-09-06 05:10:19
在C中,您将数据从0写入len-1,而在Python中,您将数据从-1写入len-2。从此行中删除-1:
data[len - idx -1 ] ^= m像这样
data[len - idx] ^= m您还需要将此行放在if:
whitenCoeff <<= 1 发布于 2016-09-06 05:12:32
C中的whitenCoeff <<= 1在一段时间后变为0,因为它是一个8位数据。
在python中,没有这样的限制,所以你必须这样写:
whitenCoeff = (whitenCoeff<<1) & 0xFF来屏蔽更高的比特。
(别忘了检查数组边界上的vz0备注)
另外还有一个缩进的问题。
重写的代码产生相同的结果:
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()稍微离题:注意C版本已经有问题了:
for(int i = 0;i<=len;i++)应该是
for(int i = 0;i<len;i++)发布于 2016-09-06 05:20:43
你还有更多的问题。
whitenCoeff <<= 1;在C代码中位于if块的外部,但它位于Python code.data[len - idx -1 ] ^= m中的if块内部,它从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)https://stackoverflow.com/questions/39337652
复制相似问题