C# 如何将字符串编组为二进制格式
C# How to marshal string become binary format
我需要将条码打印到escpos打印机,命令应该遵循这个规则:
D B m d1...dk [=11=]
.
例如:如果我想打印代码 39,命令是:write("\x1d\x6b\x04\x43\x4f\x44\x45\x20\x33\x39\x00")
我的问题是:
- 如何将
CODE 39
转换为\x43\x4f\x44\x45\x20\x33\x39
?
- 为什么这个命令不起作用
write("\x1d\x6b\x04CODE 39\x00")
?
更新
我使用此 RawHelperPrinter 将字符串打印到我的 escpos 打印机。本助手提供ide两种方法:
SendBytesToPrinter(string szPrinterName, IntPtr pBytes, Int32 dwCount)
SendStringToPrinter(string szPrinterName, string szString)
问题
我可以用这个命令打印硬编码条码(CODE 39):
SendStringToPrinter("My ESCPOS Printer", "\x1d\x6b\x04\x43\x4f\x44\x45\x20\x33\x39\x00");
但是如何打印动态条码?
更新 2
如@kunif 所述,我需要发送二进制数据来创建条形码。这是我实现它的代码:
string data = "CODE 39";
byte[] buffer = Encoding.UTF8.GetBytes(data);
IntPtr ptr = Marshal.StringToCoTaskMemAnsi(buffer);
SendStringToPrinter("My ESCPOS Printer", "\x1d\x6b\x04");
SendBytesToPrinter("My ESCPOS Printer", ptr, buffer.Length);
SendStringToPrinter("My ESCPOS Printer", "\x00");
但它仍然无法正常工作,任何 ide ?
正如我在评论中所写,转义字符串 \x04CODE
是 0x4c, 0x4f, 0x44, 0x45
结果 \x04C
似乎被评估为 \x4C
.
比如你可以查看这样一个控制台程序是如何转换的。
using System;
using System.Linq;
using System.Text;
namespace ConsoleApp1
{
internal class Program
{
static void Main(string[] args)
{
byte[] buffer = Encoding.ASCII.GetBytes("\x1d\x6b\x04CODE 39\x00");
Console.WriteLine(BitConverter.ToString(buffer));
buffer = Encoding.ASCII.GetBytes("\x1d\x6b\x04\x43ODE 39\x00");
Console.WriteLine(BitConverter.ToString(buffer));
string data = "CODE 39";
buffer = new byte[] { 0x1d, 0x6b, 0x04 };
buffer = buffer.Concat(Encoding.ASCII.GetBytes(data)).ToArray();
buffer = buffer.Concat(Encoding.ASCII.GetBytes("\x00")).ToArray();
Console.WriteLine(BitConverter.ToString(buffer));
Console.ReadLine();
}
}
}
另外,在UPDATE 2
中写的过程中,如果一个ESC/POS打印命令被分成多个方法请求,似乎不能被视为一个连续的打印命令。
这是因为即使名字是RawPrinterHelper
,也可以在数据前后添加Prefix/Suffix进行预处理和清理的数据
因此您需要创建一个 ESC/POS 打印命令作为一个字节数组并请求使用一种方法打印。
由于它是字节数组打印请求,您可能会使用 SendBytesToPrinter()
.
顺便说一句,在CODE39条码中,常见的是在条码数据前后添加一个start/stop码*
。
既然有这样的文章,请在处理数据时参考一下。
Code 39 barcodes with no start/stop characters
我需要将条码打印到escpos打印机,命令应该遵循这个规则:
D B m d1...dk [=11=]
.
例如:如果我想打印代码 39,命令是:write("\x1d\x6b\x04\x43\x4f\x44\x45\x20\x33\x39\x00")
我的问题是:
- 如何将
CODE 39
转换为\x43\x4f\x44\x45\x20\x33\x39
? - 为什么这个命令不起作用
write("\x1d\x6b\x04CODE 39\x00")
?
更新
我使用此 RawHelperPrinter 将字符串打印到我的 escpos 打印机。本助手提供ide两种方法:
SendBytesToPrinter(string szPrinterName, IntPtr pBytes, Int32 dwCount)
SendStringToPrinter(string szPrinterName, string szString)
问题
我可以用这个命令打印硬编码条码(CODE 39):
SendStringToPrinter("My ESCPOS Printer", "\x1d\x6b\x04\x43\x4f\x44\x45\x20\x33\x39\x00");
但是如何打印动态条码?
更新 2
如@kunif 所述,我需要发送二进制数据来创建条形码。这是我实现它的代码:
string data = "CODE 39";
byte[] buffer = Encoding.UTF8.GetBytes(data);
IntPtr ptr = Marshal.StringToCoTaskMemAnsi(buffer);
SendStringToPrinter("My ESCPOS Printer", "\x1d\x6b\x04");
SendBytesToPrinter("My ESCPOS Printer", ptr, buffer.Length);
SendStringToPrinter("My ESCPOS Printer", "\x00");
但它仍然无法正常工作,任何 ide ?
正如我在评论中所写,转义字符串 \x04CODE
是 0x4c, 0x4f, 0x44, 0x45
结果 \x04C
似乎被评估为 \x4C
.
比如你可以查看这样一个控制台程序是如何转换的。
using System;
using System.Linq;
using System.Text;
namespace ConsoleApp1
{
internal class Program
{
static void Main(string[] args)
{
byte[] buffer = Encoding.ASCII.GetBytes("\x1d\x6b\x04CODE 39\x00");
Console.WriteLine(BitConverter.ToString(buffer));
buffer = Encoding.ASCII.GetBytes("\x1d\x6b\x04\x43ODE 39\x00");
Console.WriteLine(BitConverter.ToString(buffer));
string data = "CODE 39";
buffer = new byte[] { 0x1d, 0x6b, 0x04 };
buffer = buffer.Concat(Encoding.ASCII.GetBytes(data)).ToArray();
buffer = buffer.Concat(Encoding.ASCII.GetBytes("\x00")).ToArray();
Console.WriteLine(BitConverter.ToString(buffer));
Console.ReadLine();
}
}
}
另外,在UPDATE 2
中写的过程中,如果一个ESC/POS打印命令被分成多个方法请求,似乎不能被视为一个连续的打印命令。
这是因为即使名字是RawPrinterHelper
,也可以在数据前后添加Prefix/Suffix进行预处理和清理的数据
因此您需要创建一个 ESC/POS 打印命令作为一个字节数组并请求使用一种方法打印。
由于它是字节数组打印请求,您可能会使用 SendBytesToPrinter()
.
顺便说一句,在CODE39条码中,常见的是在条码数据前后添加一个start/stop码*
。
既然有这样的文章,请在处理数据时参考一下。
Code 39 barcodes with no start/stop characters