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

C# 如何将这段C代码转换为C版本?,c#,c,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 可固定(参考第一); 固定字节(参考秒); 输出=(字节)(字节)(第一个>>3&0b00001111)|(字节)(第二个我建议您阅读和的文档 voi

所以我试图得到这个精确的代码,但在C中,我所要解决的是代码的“ref”和“out”部分

private static void FixItUp(ref byte first,ref byte second,out byte output)
{
//d3d2d1d0p2p1p0
//p2-d3d2d1
//p1-d3d1d0
//p0-d2d1d0
可固定(参考第一);
固定字节(参考秒);
输出=(字节)(字节)(第一个>>3&0b00001111)|(字节)(第二个我建议您阅读和的文档

void FixItUp(uint8_t*第一,uint8_t*第二,uint8_t*输出)
{
固定(第一);
可固定(第二);
*输出=((*first)>>3&0b00001111)|((*second)我建议您阅读和的文档

void FixItUp(uint8_t*第一,uint8_t*第二,uint8_t*输出)
{
固定(第一);
可固定(第二);
*输出=((*第一)>>3&0b00001111)|((*第二)
  • 对于要传递给
    FixNibble
    first
    second
    ,如图所示,它们可能必须是指针,因为C不通过引用传递。这假设
    FixNibble
    类似于
    void FixNibble(uint8\u t*);
    。但是,将它们按值传递给
    FixItUp
    函数更为明智

  • 输出
    也必须是指针,才能通过它返回结果

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

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

  • 可读性:使用额外的括号来记录运算符的优先顺序。我们可以通过将表达式拆分为几行来提高其可读性


#包括
静态无效固定(uint8_t第一,uint8_t第二,uint8_t*输出)
{
固定字节(&第一);
固定字节(&秒);
first=((uint32_t)first>>3)和0x0Fu;
秒=((uint32_t)秒>3)和0x0Fu);
秒=(uint8_t)((uint32_t)秒
  • 对于要传递给
    FixNibble
    first
    second
    ,如图所示,它们可能必须是指针,因为C不通过引用传递。这假设
    FixNibble
    类似于
    void FixNibble(uint8\u t*);
    。但是,将它们按值传递给
    FixItUp
    函数更为明智

  • 输出
    也必须是指针,才能通过它返回结果

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

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

  • 可读性:使用额外的括号来记录运算符的优先顺序。我们可以通过将表达式拆分为几行来提高其可读性


#包括
静态无效固定(uint8_t第一,uint8_t第二,uint8_t*输出)
{
固定字节(&第一);
固定字节(&秒);
first=((uint32_t)first>>3)和0x0Fu;
秒=((uint32_t)秒>3)和0x0Fu);

秒=(uint8_t)((uint32_t)其次,C#中的
byte
unsigned char
uint8_t
匹配的可能性不大。C#中的
out
与C#中的指针相对应。我没有研究过C#,所以我不知道
ref
在函数接口或对
FixNibble()的调用中的含义
。您将在作业中使用
*输出
。您还需要什么取决于
修复文件()
函数和
ref
@JonathanLeffler的含义我对C不太了解,但我相信
ref
out
都对应于C中的指针。
out
只是告诉编译器对象需要在方法内部初始化,而
ref
意味着它应该已经初始化了。我不知道“你不认为C中存在这种区别吗?是的,C中等价的字节是uint8_t。@AhmedAbdelhameed-不,C中没有办法区分“由调用者初始化,在这里用作指针”和“指针需要由被调用的代码分配”。最近的方法是使用
const
限定符,但这并不令人满意。我不会惊讶地发现
ref
确实表示“作为指针传递”,但我不确定为什么它会出现在对
FixNibble()
的调用中-这可能意味着
FixNibble()所做的任何更改
将反映在两个
FixItUp()中
和调用它的代码。但我不是一个C#编码器。C#中的
byte
unsigned char
uint8_t
匹配的可能性不大。C#中的
out
将对应于C中的指针。我没有研究过C#,所以我也不知道
ref
在函数接口中的含义或调用
FixNibble()
。您将在作业中使用
*输出
。您还需要什么取决于
FixNibble()
函数和
ref
@JonathanLeffler的含义我对C不太了解,但我相信
ref
out
都对应于C中的指针。
out
只是告诉编译器对象需要在方法内部初始化,而
ref
意味着它应该已经初始化了。我不知道“你不认为C中存在这种区别吗?是的,C中等价的字节是uint8_t。@AhmedAbdelhameed-不,C中没有办法区分“由调用方初始化,用作po”
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));
    }
void FixItUp(uint8_t* first, uint8_t* second, uint8_t* output)
    {
        FixNibble(first);
        FixNibble(second);

        *output = (((*first) >> 3 & 0b00001111) | ((*second) << 1 & 0b11110000));
    }
#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;
}
#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);
}