【问题标题】:C# Array.Value differs from created array in c++C# Array.Value 与 C++ 中创建的数组不同
【发布时间】:2013-11-15 11:40:02
【问题描述】:

在 C# 中处理以下情况的最佳方法是什么?

我有一个用 C/C++ 编写的服务器应用程序。

例如 它创建一个长度为256unsigned char 缓冲区。 在这个缓冲区中,服务器存储客户端发送给它的数据。存储后,对接收到的缓冲区进行一些密码学检查。

我正在用 C# 为这个服务器编写一个客户端。

问题是服务器期望的固定长度为 256 的缓冲区。

当我创建一个内容和总长度为 256 的 byte[] 数组时,密码检查失败。

我发现的原因很简单。服务器需要一个 256 字节长的缓冲区。例如,如果消息是"Hello World",则缓冲区的其余部分必须填充为 0。 或者,更好的解释是:字节需要是(unsigned) "204"(signed) "-52"

我认为这是一个 C/C++ 概念问题/问题。

为了解决我的问题,我明确设置了该值。

public static byte[] GetCBuffer(this byte[] data, int len)
{
    byte[] tmp = new byte[len];
    for(int i = 0; i < len; i++)
        if(i < data.Length)
            tmp[i] = data[i];
        else
            tmp[i] = 204;
    return tmp;
}

有没有更好的方法来处理这些艺术预期字节?我没有看到重要的东西吗?

【问题讨论】:

  • 基于这个answer将一个字节数组初始化为某个值,而不是默认的null?我会说你的解决方案是一个很好的解决方案。
  • 我会进一步概括并传入“空白”值,因此如果该值不是 204,您可以在不修改的情况下再次重复使用。

标签: c# integer


【解决方案1】:

如果你不喜欢代码中的if,你可以试试LINQ:

public static byte[] GetCBuffer(this byte[] data, int len)
{
    byte[] tmp = Enumerable.Repeat((byte)204, len).ToArray();
    for(int i = 0; i < data.Length; i++)
    {
      tmp[i] = data[i];
    }

    return ret;
}

但从概念上讲,它是相同的,只是看起来(可以说)更好一点。

【讨论】:

  • 您也可以用 Zip 替换循环并将 ToArray 放在返回上。
【解决方案2】:

您能否将整个数组“memset”为所需的填充字符,然后插入实际数据?

【讨论】:

  • 这听起来像是一个更易读的结果,另外你可以在清除数据后Buffer.BlockCopy
  • 你能具体说说你的想法吗?如何在没有 pinvoke 开销的情况下实现 memset?事实上,我之前已经尝试过 BlockCopy。但是元素比 0 填充。处理元素时,Whitch 将在服务器端失败。
  • 您的帖子说:“我有一个用 C/C++ 编写的服务器应用程序。...它创建了一个长度为 256 的无符号字符缓冲区。”所以我假设它是 C/C++ 并且需要在创建数组时完成。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-11-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多