【问题标题】:unsigned char pointer in C#?C#中的无符号字符指针?
【发布时间】:2011-01-29 15:06:12
【问题描述】:

在将一些代码从 C++ 翻译成 C# 的过程中,我发现了这个,

unsigned char *p = m_pRecvBuffer + 5;
unsigned int noncelen1 = *p * 256 + p[1];

如何将其翻译成 C#? m_pRecvBuffer 是一个字符数组,但我将它存储为一个字节数组。

【问题讨论】:

    标签: c# c++ pointers unsigned-char


    【解决方案1】:

    嗯,我想知道是否需要对这段代码进行一些重构。是的,您可以使用pointers in C#。但是,基于该 sn-p 可能会有更好的选择。看起来您正在尝试读取传入流的部分内容。也许 C# 的 stream library 更适合您的这段代码?

    【讨论】:

      【解决方案2】:

      您分析代码的实际作用并翻译行为,而不是代码。虽然您可以在 c# 中使用 unsafe 方法和指针运算,但这可能会产生比它解决的问题更多的问题。

      【讨论】:

      • 是的,我知道这一点。但是,由于我对 C# 的了解比 C++ 多,并且无法调试给定的代码,所以我解决这个问题的第一步是让它在 C# 中工作,然后将其重构为更好的东西。
      • 啊好吧。对我来说同样的问题,我认为它是数组索引,但我无法解决它。
      【解决方案3】:

      类似于

      byte[] p = new byte[m_pRecvBuffer.Length - 5];
      Array.Copy(m_precvBuffer, p, m_pRecvBuffer.Length - 5);
      uint noncelen1 = p[0] * 256 + p[1];
      

      但在这种情况下,我认为您实际上不需要使用数组副本。只是使用

      uint noncelen1 = p[5] * 256 + p[6];
      

      应该够了,我猜。

      【讨论】:

      • 我走这条路是因为它类似于我已经编写的代码。
      • @hokkaido:如果您要像这样声明一个新的字节数组,然后复制数据,这比我发布的答案效率低得多。没有理由分配内存或复制数组。
      • @Jonathan,请注意,我也是这么说的。但是您不知道其余代码的外观。可能是有些东西只能获得一个指针并从那里开始读取,也许将其重构为数组 + 偏移量是不可行的。从 OP 的小代码 sn-p 很难分辨。
      【解决方案4】:

      假设 RecvBuffer 被声明为 byte[],你会做这样的事情:

      int noncelen1 = RecvBuffer[5] * 256 + RecvBuffer[6];
      

      【讨论】:

        猜你喜欢
        • 2023-01-17
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-03-21
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多