小编典典

将字节数组初始化为某个值,而不是默认的null?

all

我正忙着将一个用 C++ 完成的旧项目重写为 C#。

我的任务是重写程序,使其功能尽可能接近原始程序。

在一堆文件处理过程中,之前编写此程序的开发人员创建了一个结构,其中包含大量字段,这些字段对应于文件必须写入的设置格式,因此所有这些工作已经为我完成了。

这些字段都是字节数组。然后 C++ 代码所做的是memset将整个结构设置为所有空格字符 ( 0x20)。一行代码。简单的。

这非常重要,因为该文件最终进入的实用程序需要这种格式的文件。我必须做的是将此结构更改为 C#
中的一个类,但我找不到一种方法可以轻松地将每个字节数组初始化为所有空格字符。

我最终不得不做的是在类构造函数中:

//Initialize all of the variables to spaces.
int index = 0;
foreach (byte b in UserCode)
{
    UserCode[index] = 0x20;
    index++;
}

这很好用,但我确信必须有一种更简单的方法来做到这一点。当数组UserCode = new byte[6]在构造函数中设置为时,字节数组会自动初始化为默认的空值。有没有办法让它在声明时变成所有空格,这样当我调用我的类的构造函数时,它会像这样立即初始化?还是一些memset类似的功能?


阅读 63

收藏
2022-08-05

共1个答案

小编典典

对于小型数组,使用数组初始化语法:

var sevenItems = new byte[] { 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20 };

对于较大的数组,请使用标准for循环。这是最易读和最有效的方法:

var sevenThousandItems = new byte[7000];
for (int i = 0; i < sevenThousandItems.Length; i++)
{
    sevenThousandItems[i] = 0x20;
}

当然,如果您经常需要这样做,那么您可以创建一个帮助方法来帮助保持代码简洁:

byte[] sevenItems = CreateSpecialByteArray(7);
byte[] sevenThousandItems = CreateSpecialByteArray(7000);

// ...

public static byte[] CreateSpecialByteArray(int length)
{
    var arr = new byte[length];
    for (int i = 0; i < arr.Length; i++)
    {
        arr[i] = 0x20;
    }
    return arr;
}
2022-08-05