使用单个值/变量构建字节数组[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类的),那么这项工作就完成了:)
有什么想法吗?
谢谢:)
您需要从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>