2

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

我的目标:我有一个 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);

此链接包含我考虑使用的一种方法:Converting a list of ints to a byte array

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

因此,如果我可以获取我的 xml 中的值(我目前已经在读入一个类)并构建一个字节数组,那么我就可以抓住那个字节数组(它可以是静态的,而且很可能是我的单身人士类)那么这将完成:)

有什么想法伙计和伙计?

非常感谢 :)

4

2 回答 2

1

那么您需要从 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();

你去吧。如果我有一些小错误,你将能够修复它。

于 2013-02-12T21:59:52.480 回答
1

我会说废弃“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>
于 2013-02-12T22:11:50.943 回答