如何检查字节数组是否以回车符结束

时间:2014-01-31 11:35:17

标签: c#

我想知道我的字节数组在回车时结束了,如果不是,我想添加它。

这就是我尝试过的东西

byte[] fileContent = File.ReadAllBytes(openFileDialog.FileName);
byte[] endCharacter = fileContent.Skip(fileContent.Length - 2).Take(2).ToArray();

if (!(endCharacter.Equals(Encoding.ASCII.GetBytes(Environment.NewLine))))
{
    fileContent = fileContent.Concat(Encoding.ASCII.GetBytes(Environment.NewLine)).ToArray();
}

但我不明白......这是正确的做法吗?如果是这样,平等有什么问题?即使我的字节数组以{10,13}结尾,If语句也永远不会检测到它。

2 个答案:

答案 0 :(得分:3)

在这种情况下,Equals检查引用相等性;虽然endCharacterEncoding.ASCII.GetBytes(Environment.NewLine)可能具有相同的内容,但它们不是同一个数组,因此Equals会返回false

您对 value 相等感兴趣,因此您应该单独比较数组中每个位置的值:

newLine = Encoding.ASCII.GetBytes(Environment.NewLine);
if (endCharacter[0] != newLine[0] && endCharacter[1] != newLine[1])
{
    // ...
}

通常,如果要比较数组的值相等,可以使用Marc Gravell提供的this method之类的内容。

但是,对您的问题更有效的解决方案是将文件的最后两个字节转换为ASCII并进行字符串比较(因为System.String已经重载==以检查值是否相等):

string endCharacter = Encoding.ASCII.GetString(fileContent, fileContent.Length - 2, 2);
if (endCharacter == Environment.NewLine)
{
    // ...
}

如果整个文件可能很大,您可能还需要小心将其读入内存。如果您不需要文件的全部内容,则可以通过读取最后两个字节,检查它们并根据需要直接附加到文件来更有效地执行此操作。这可以通过为文件打开System.IO.FileStream来实现(通过System.IO.File.Open)。

答案 1 :(得分:0)

我找到了解决方案,我必须使用SequenceEqual(http://www.dotnetperls.com/sequenceequal)代替Equals。谢谢大家!

byte[] fileContent = File.ReadAllBytes(openFileDialog.FileName);
byte[] endCharacter = fileContent.Skip(fileContent.Length - 2).Take(2).ToArray();

if (!(endCharacter.SequenceEqual(Encoding.ASCII.GetBytes(Environment.NewLine))))
{
     fileContent = fileContent.Concat(Encoding.ASCII.GetBytes(Environment.NewLine)).ToArray();
     File.AppendAllText(openFileDialog.FileName, Environment.NewLine);
}