如何在仅包含 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);
}
我有一个 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);
}