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")

我的问题是:

  1. 如何将CODE 39转换为\x43\x4f\x44\x45\x20\x33\x39
  2. 为什么这个命令不起作用write("\x1d\x6b\x04CODE 39\x00")

更新

我使用此 RawHelperPrinter 将字符串打印到我的 escpos 打印机。本助手提供ide两种方法:

  1. SendBytesToPrinter(string szPrinterName, IntPtr pBytes, Int32 dwCount)
  2. 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 ?

正如我在评论中所写,转义字符串 \x04CODE0x4c, 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