将命令/ByteArray 转义为可读文本 C#
Escape commands / ByteArray to Readable Text C#
我使用 C# 开发了一个 POS 应用程序,用于收据打印,我使用 NuGet 的 PrinterUtility 库,它将字符串转换为 ByteArray,保存并将其发送到收据打印机进行打印。由于我没有收据打印机,如何将生成的文件转换为可读文本?我用notepad++打开了结果文件,内容如附图所示
click on the link to view the image
我想知道这个 ByteArray 结果是否可以呈现为文本并显示在 RichTextBox 中,或者是否有任何方法可以创建可以显示结果的虚拟收据打印机?
我们将不胜感激。
Link 到文件
Click Here To Download The File
试试这个简单的解析器。
它检测 SOH
(标题开始)和 GS
(组分隔符)转义码和 ignores/skips NUL
和 ESC
代码及其连接的标识符(如果有)。
当读取所有字节或找到 ETX
(文本结束)代码时,解析终止。
这是一个非常简单的嵌套 while 循环,因此您可以轻松地对其进行调整,以处理特殊情况。
解析的字符被添加到 StringBuilder object。
► 请注意,这仅处理 ASCII 字符。对于不使用 ASCII 字符的语言,您需要构建字节数组(而不是使用 StringBuilder 的字符数组),然后使用 Encoding.[Some Encoding].GetString([Parsed Byte Array])
将字节数组解码为 .Net 字符串格式。
在 RichTextBox 中使用等宽字体(Consolas、Courier New 等)。
var bytes = [Your Byte Array];
var charBuffer = new StringBuilder(bytes.Length);
int nul = 0x00; // NULL char
int soh = 0x01; // Start of Heading
int etx = 0x03; // End of Text
int esc = 0x1B; // Escape
int gs = 0x1D; // Group Separator
int pos = 0;
while (pos < bytes.Length) {
byte byteValue = bytes[pos];
if (byteValue == soh || byteValue == gs || byteValue == nul) {
pos += byteValue == gs ? 3 : 1;
if (pos == etx) break;
while (bytes[pos] != gs && bytes[pos] != esc) {
charBuffer.Append((char)bytes[pos]);
pos += 1;
}
}
pos += 1;
}
richTextBox1.Text = charBuffer.ToString();
我使用 C# 开发了一个 POS 应用程序,用于收据打印,我使用 NuGet 的 PrinterUtility 库,它将字符串转换为 ByteArray,保存并将其发送到收据打印机进行打印。由于我没有收据打印机,如何将生成的文件转换为可读文本?我用notepad++打开了结果文件,内容如附图所示
click on the link to view the image
我想知道这个 ByteArray 结果是否可以呈现为文本并显示在 RichTextBox 中,或者是否有任何方法可以创建可以显示结果的虚拟收据打印机?
我们将不胜感激。
Link 到文件 Click Here To Download The File
试试这个简单的解析器。
它检测 SOH
(标题开始)和 GS
(组分隔符)转义码和 ignores/skips NUL
和 ESC
代码及其连接的标识符(如果有)。
当读取所有字节或找到 ETX
(文本结束)代码时,解析终止。
这是一个非常简单的嵌套 while 循环,因此您可以轻松地对其进行调整,以处理特殊情况。
解析的字符被添加到 StringBuilder object。
► 请注意,这仅处理 ASCII 字符。对于不使用 ASCII 字符的语言,您需要构建字节数组(而不是使用 StringBuilder 的字符数组),然后使用 Encoding.[Some Encoding].GetString([Parsed Byte Array])
将字节数组解码为 .Net 字符串格式。
在 RichTextBox 中使用等宽字体(Consolas、Courier New 等)。
var bytes = [Your Byte Array];
var charBuffer = new StringBuilder(bytes.Length);
int nul = 0x00; // NULL char
int soh = 0x01; // Start of Heading
int etx = 0x03; // End of Text
int esc = 0x1B; // Escape
int gs = 0x1D; // Group Separator
int pos = 0;
while (pos < bytes.Length) {
byte byteValue = bytes[pos];
if (byteValue == soh || byteValue == gs || byteValue == nul) {
pos += byteValue == gs ? 3 : 1;
if (pos == etx) break;
while (bytes[pos] != gs && bytes[pos] != esc) {
charBuffer.Append((char)bytes[pos]);
pos += 1;
}
}
pos += 1;
}
richTextBox1.Text = charBuffer.ToString();