C# Array.Value 不同于在 C++ 中创建的数组

标签 c# integer

在 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;
}

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

最佳答案

如果你不喜欢代码中的 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;
}

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

关于C# Array.Value 不同于在 C++ 中创建的数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19774744/

相关文章:

c# - 小数、整数、类型转换……天啊!

c# - 如何将项目添加到 IEnumerable<T> 集合?

c# - Angular7 - .NET Core v2 抛出 http 415(不支持的媒体类型)

c# - 使用 HtmlDecode 或 Escape 解码字符串

Java泛型问题

python : Clean and efficient way to remove items that are not convertable to int from list

c# - 如何通过 float 表示形式将 float 转换为 int?

c# - 仅从联合子类返回某些子类

c# - Linq 到实体 : using ToLower() on NText fields

c# - 小数的不同位整数内的显着性能差异