如何在仅包含 6 个字符的情况下保存 char[25] C#

How to save a char[25] when it contains only 6 chars C#

我有一个 class 包含如下内容

public class foo
{
    public long id= 0;
    public char[] TestId = new char[25];// new char[25];
    public char[] GUID = new char[64]; //new char[64];
    public char[] sign = new char[61];//new char[61];
    public int DemandDate = 0;
    public int CompleteDate = 0;
    public int DownloadDate = 0;

}
    static public void WriteFile(string fileName, List<ClientInfo> list)
    {
        using (FileStream fs = new FileStream(fileName, FileMode.Create))
        {
            using (var writer = new BinaryWriter(fs, Encoding.UTF8, false))
            {
                foreach(ClientInfo ci in list)
                {
                    WriteClientInfo(writer, offset, ociv);
                    offset += header.recordSize;
                }
            }
        }
    }

    private static void WriteClientInfo(BinaryWriter writer, int offset, ClientInfo ci)
    {
        try
        {
            writer.Write(ci.ID);
            writer.Write(ci.TestId, 0, 25);
            writer.Write(ci.GUID, 0, 64 );
            writer.Write(ci.Sign, 0, 61);
            writer.Write(ci.DemandDate);
            writer.Write(ci.CompleteDate);
            writer.Write(ci.DownloadDate);
        }
        catch (Exception ex)
        {

        }
    }

当我序列化这个 ci.TestId 时会崩溃,指出索引超出范围。 我知道 ci.TestId 中的值 = FD3394,但我需要能够保存 25 个字符的长度,而不是 ci.TestId 的实际长度。因为我从一个用 C++ 编写的程序中读取了这个结构,它必须是定义中 char 长度的确切大小,而不是使用的长度。我在 C# 中修改它,但也需要在 C++ 中读回。

我会检查序列化的 ClientInfo 数据是否 truncating/trimming ci.TestId。您确定 ci.TestId 看起来像这样吗: 'FD3394 '。 (即用某种形式的前面填充后面。否则,我的猜测是如果它实际上没有 25 个字符,你将无法写入 25 个字符计数。也许在写入时用填充格式化 ci.TestId。

您可以像这样使用 PadLeft() 或 PadRight() 方法

TestId = TestId.PadLeft(25);

左侧将用空格填充。

您必须将其转换为字符串,然后 re-convert 将其转换为 char[]

TestId = _testId.PadLeft(25).ToCharArray();

修改您的作者代码:

if(ci.TestId.Length >= 25){
  writer.Write(ci.TestId, 0, 25);
} else {
  writer.Write(ci.TestId);
  writer.Write(new char[25-ci.TestId.Length]);
}

如果要左边的nils,先写:

else {
  writer.Write(new char[25-ci.TestId.Length]);
  writer.Write(ci.TestId);
}