我有一些问题需要了解如何阅读不同于文本格式的文件。我知道在给定文件中有一些信息作为字符串。我设法将十六进制代码写入一个文本文件,这对我的过程的另一个功能有很大的帮助,因为我知道在一些十六进制代码组合之后,文件中可能会有字符串写入。
例如,我有这批十六进制代码。 00 39 AF 32 DD 24 BA 09 07 06 03 DB 我知道当十六进制代码等于AF 32时,下一个信息应该是字符串。例如:“发票编号223232”
任何帮助或参考将不胜感激。
亲切的问候,
static void Main(string[] args)
{
StreamWriter writer = new StreamWriter("output.txt", true);
FileStream fs = new FileStream("File", FileMode.Open);
int hexIn;
String hex;
for (int i = 0; (hexIn = fs.ReadByte()) != -1; i++)
{
writer.Write(hexIn + " ");
hex = string.Format("{0:X2}", hexIn);
writer.Write(hex + " ");
}
}
答案 0 :(得分:0)
您拥有的示例代码看起来像是在尝试读取二进制文件,而不是十六进制编码的文本文件。
如果源文件是二进制文件(这是理想的),您将逐字节读取它,并通过状态机运行以了解何时需要字符串。你必须知道字符串有多长。在下面的示例中,我假设一个以null结尾的C风格字符串。对于pascal样式字符串,您可以读取长度前缀,或者对于固定宽度,只需跟踪预期的字符数。
bool done = false;
int state = 0;
StringBuilder result = new StringBuilder();
while (!done) {
int byteValue = fs.ReadByte();
if (bytesValue == -1)
done = true;
else {
switch (state) {
case 0: //looking for 0xAF
if (byteValue == 0xAF)
state = 1;
break;
case 1: //looking for 0x32
if (byteValue == 0x32)
state = 2;
else
state = 0;
break;
case 2: //start reading string
if (byteValue == 0) {//end of C-style string
//Do something with result.ToString()
result.Clear();
state = 0; //go back to looking for more strings
} else {
result.Append((char)byteValue); //assuming 8-bit ASCII string
}
break;
}
}
}
如果您正在读取十六进制编码的文本文件,那将会更加困难,因为您必须一次读取十六进制半字节并重建字节,但状态机方法将类似。