首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Python的C函数(不同的结果)

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

Stack Overflow用户
提问于 2016-09-06 05:01:12
回答 5查看 76关注 0票数 3

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

这是C语言版本的代码,它可以工作:

代码语言:javascript
复制
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中所做的是:

代码语言:javascript
复制
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位更大。

EN

回答 5

Stack Overflow用户

发布于 2016-09-06 05:10:19

在C中,您将数据从0写入len-1,而在Python中,您将数据从-1写入len-2。从此行中删除-1:

代码语言:javascript
复制
data[len - idx -1 ] ^= m

像这样

代码语言:javascript
复制
data[len - idx] ^= m

您还需要将此行放在if:

代码语言:javascript
复制
whitenCoeff <<= 1 
票数 1
EN

Stack Overflow用户

发布于 2016-09-06 05:12:32

C中的whitenCoeff <<= 1在一段时间后变为0,因为它是一个8位数据。

在python中,没有这样的限制,所以你必须这样写:

代码语言:javascript
复制
whitenCoeff = (whitenCoeff<<1) & 0xFF

来屏蔽更高的比特。

(别忘了检查数组边界上的vz0备注)

另外还有一个缩进的问题。

重写的代码产生相同的结果:

代码语言:javascript
复制
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版本已经有问题了:

代码语言:javascript
复制
for(int i = 0;i<=len;i++)

应该是

代码语言:javascript
复制
for(int i = 0;i<len;i++)
票数 1
EN

Stack Overflow用户

发布于 2016-09-06 05:20:43

你还有更多的问题。

  1. whitenCoeff <<= 1;在C代码中位于if块的外部,但它位于Python code.
  2. data[len - idx -1 ] ^= m中的if块内部,它从C代码向后工作。

这段代码产生与你的C代码相同的输出:

代码语言:javascript
复制
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)
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/39337652

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档