将按位运算从C#移植到C

时间:2018-07-26 06:11:11

标签: c# c bit-manipulation bitwise-operators bit-shift

我需要一些帮助将此C#代码移植到C。我可以在C#中正常工作,但在C中得到错误的返回。我应该将移位分隔成几行吗?我以为数据类型存在问题,但我认为数据类型正确。这是返回0x03046ABE的工作代码

  UInt32 goHigh(UInt32 x) { return (UInt32)(x & 0xFFFF0000); }          
  UInt32 goLow(UInt32 x) { return (UInt32)(x & 0xFFFF); } 

  UInt32 magic(UInt32 pass){
      UInt32 key = pass;
      UInt16 num = 0x0563;
      key = (goLow(key) << 16) | (UInt16)(((num >> 3) | (num << 13)) ^ (goHigh(key) >> 16));
      return key; //returns 0x03046ABE

   }

  magic(0x01020304);

这是我试图开始工作的不正确的C代码

  unsigned long  goHigh(unsigned long  x) { 
         return (unsigned long )(x & 0xFFFF0000); }          
  unsigned long  goLow(unsigned long  x) { 
         return (unsigned long )(x & 0xFFFF); } 

  unsigned long  magic(unsigned long  pass){
      unsigned long key = pass;
      unsigned int num = 0x0563;
      key = (goLow(key) << 16) | (unsigned int)(((num >> 3) | (num << 13)) ^ (goHigh(key) >> 16));
      return key;
  }

  magic(0x01020304); //returns 0xb8c6a8e

2 个答案:

答案 0 :(得分:5)

最可能的问题在这里:

select  stuff (
               (select ',' + value
                from    STRING_SPLIT  ('000001U;000002;000003U;000004;000005U;000006U', ';')
                where   right(value, 1) <> 'U'
                 for    xml path('')), 
                1, 1, '')

您期望的是16位。在不同的机器上可能更大。与unsigned long相同,如您所料,它可能是64位而不是32位。

请确保使用key = (goLow(key) << 16) | (unsigned int)(((num >> 3) | (num << 13)) ^ (goHigh(key) >> 16)); ^^^^^^^^^^^^ uint32_t。您必须uint16_t才能使用它们。

答案 1 :(得分:3)

long和int不是您在平台上期望的大小(分别为32位和16位)

将基本类型替换为实际大小,并且将得到相同的输出。我还删除了多余的演员表。

这些类型可以在stdint.h中找到

  export default {
    data: function() {
      return {
        id: this.$route.params.id,
        e: {},
        users: []
      }
    },
    methods: {
      issueTicket: function(id, user) {

      }
    },
    created(){
      this.$http.get('http://localhost:1337/api/v1/event/find', { params : { id : this.id } }).then(result => {
        this.e = result.body.result[0];
      })
    }
  }
相关问题