使用单个值/变量构建字节数组[4]

本文关键字:数组 字节数 字节 构建 单个值 变量 | 更新日期: 2023-09-27 17:58:56

首先介绍一下我的目标,然后我将向您展示我的代码,以及我目前认为哪种方法是最好的方法。

我的目标:我有一个XML文件,其中存储了5个值,我想用这些值创建一个字节数组

我使用Microsoft.PointOfService在应用程序中硬编码了以下命令:

m_Printer.PrintNormal(PrinterStation.Receipt, System.Text.ASCIIEncoding.ASCII.GetString(new byte[] { 27, 112, 48, 55, 121 }))

正如您所看到的,字节数组是硬编码的。

这段代码工作正常,但我所做的是创建一个XML文件,该文件将被读取以读入值(这些值用于启动通过RJ11电缆连接到EPSON打印机的提款机),这样用户就可以更改XML,而不必重新编译代码。

XML如下:

<OpenCashDrawerCommand> 
    <Byte1 value="27"/> 
    <Byte2 value="112"/> 
    <Byte3 value="48"/> 
    <Byte4 value="55"/> 
    <Byte5 value="121"/> 
</OpenCashDrawerCommand>

所以你可以看到,我正在从C#代码中获取硬编码的值,并将其读取到代码中的5个变量中。

然后,我想使用这5个值创建一个字节数组,并像这样传递新的字节数组:

m_Printer.PrintNormal(PrinterStation.Receipt, System.Text.ASCIIEncoding.ASCII.GetString(MYNEWBYTEARRAY);

这个链接包含一种我考虑过使用的方法:将int列表转换为字节数组

var bytes = integers.Select(i => BitConverter.GetBytes(i)).ToArray();

因此,如果我可以获取xml中的值(我目前已经将其读取到一个类中)并构建一个字节数组,那么我就可以获取该字节数组(它可以是静态的,很可能是针对我的singleton类的),那么这项工作就完成了:)

有什么想法吗?

谢谢:)

使用单个值/变量构建字节数组[4]

您需要从XML中提取值。我假设你可以使用XLINQ:

XDocument doc = XDocument.Parse(xmlString);
XElement root = from e in doc.DocumentElement/*don't remember the exact name*/;
var byteElements = new [] { root.Element("Byte1"), root.Element("Byte2"), ... };
var bytes =
 byteElements
 .Select(elem => (byte)elem); //this "cast" is an implicit conversion operator
 .ToArray();

就这样。如果我有什么小错误,你可以修复它。

我想放弃"ByteN"命名约定,只使用XML序列化将其转换为XML:

[Serializable]
public class SomeClass
{
    // Serialize the list as an array with the form:
    //  <OpenDrawerCommand>
    //      <byte>...</byte>
    //      <byte>...</byte>
    //      <byte>...</byte>
    //  </OpenDrawerCommand>
    [System.Xml.Serialization.XmlArray("OpenDrawerCommand")]
    [System.Xml.Serialization.XmlArrayItemAttribute("byte")]
    public List<byte> CommandBytes {get; set;}
}

void Main()
{
    var cmd = new SomeClass() 
    { 
        CommandBytes = new List<byte> { 27, 112, 48, 55, 121 }
    };
    var originalBytes = cmd.CommandBytes;
    var sb = new StringBuilder();
    var ser = new System.Xml.Serialization.XmlSerializer(typeof(SomeClass));
    using(var sw = new StringWriter(sb))
    using(var xw = XmlWriter.Create(sw))
        ser.Serialize(xw, cmd);
    Console.WriteLine(sb.ToString());
    cmd = new SomeClass();
    Debug.Assert(cmd.CommandBytes == null);
    using(var sr = new StringReader(sb.ToString()))
    using(var xr = XmlReader.Create(sr))
        cmd = (SomeClass)ser.Deserialize(xr);
    Debug.Assert(cmd.CommandBytes.SequenceEqual(originalBytes));
    Console.WriteLine(string.Join(", ", cmd.CommandBytes));
}

上面的XML看起来像:

<?xml version="1.0" encoding="utf-16"?>
<SomeClass xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
    <OpenDrawerCommand>
        <byte>27</byte>
        <byte>112</byte>
        <byte>48</byte>
        <byte>55</byte>
        <byte>121</byte>
    </OpenDrawerCommand>
</SomeClass>