这段C#代码将如何转换为C版本?

时间:2019-10-17 10:05:09

标签: c# c

  

因此,我尝试使用确切的代码,但是在C语言中,我苦苦挣扎的是代码的“ ref”和“ out”部分。

private static void FixItUp(ref byte first, ref byte second, out byte output)
    {
        //d3d2d1d0p2p1p0
        //p2 - d3d2d1
        //p1 - d3d1d0
        //p0 - d2d1d0
        FixNibble(ref first);
        FixNibble(ref second);

        output = (byte)((byte)(first >> 3 & 0b00001111) | (byte)(second << 1 & 0b11110000));
    }

2 个答案:

答案 0 :(得分:1)

我建议您阅读how C pass arguments to functionrefout的文档

void FixItUp(uint8_t* first, uint8_t* second, uint8_t* output)
    {
        FixNibble(first);
        FixNibble(second);

        *output = (((*first) >> 3 & 0b00001111) | ((*second) << 1 & 0b11110000));
    }

因此您的C代码应如下所示,应将引用传递给函数FixNibble,但应使用参数值来计数output,还请注意{{1}之间的区别}和ref 输出类似于ref关键字,不同之处在于ref要求在传递变量之前先对其进行初始化

答案 1 :(得分:1)

  • 要使firstsecond传递到FixNibble,如图所示,由于C不能通过引用传递,因此它们很可能必须是指针。假设FixNibble类似于void FixNibble(uint8_t*);。但是,将它们按值传递给FixItUp函数会更明智。

  • output也必须是一个指针,以便通过它返回结果。

  • C不支持二进制整数常量,因此必须将其转换为十六进制。进行按位运算时,请始终使用无符号常量。

  • C包含各种危险的隐式提升规则,这些规则必须在移位之前规避。最简单的方法是将其转换为大整数类型,例如uint32_t

  • 可读性:使用额外的括号来标注自文档运算符的优先顺序。通过将表达式分成几行,可以使表达式更具可读性。


#include <stdint.h>

static void FixItUp (uint8_t first, uint8_t second, uint8_t* output)
{
  FixNibble(&first);
  FixNibble(&second);

  first   = ((uint32_t)first  >> 3) & 0x0Fu;
  second  = ((uint32_t)second << 1) & 0xF0u;
  *output = first | second;
}

或使用等效的学步车/ MISRA-C兼容版本:

#include <stdint.h>

static void FixItUp (uint8_t first, uint8_t second, uint8_t* output)
{
  FixNibble(&first);
  FixNibble(&second);

  first   = (uint8_t) ( ((uint32_t)first  >> 3) & 0x0Fu );
  second  = (uint8_t) ( ((uint32_t)second << 1) & 0xF0u );
  *output = (uint8_t) (first | second);
}