2

最初に私の目標について少し背景を説明し、次に私のコードと、現時点で最良のアプローチであると現在考えているアプローチを示します。

私の目標:5つの値が格納されているXMLファイルがあり、これらの値を使用してバイト配列を作成します

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の値(現在クラスに既に読み込んでいます)を取得してバイト配列を作成できる場合は、そのバイト配列を取得できます(静的である可能性が高く、シングルトンの場合が多いでしょう)。クラス)それからそれは仕事が行われるでしょう:)

何か考えはありますか?

どうもありがとう :)

4

2 に答える 2

1

「ByteN」の命名規則を廃止し、XMLシリアル化を使用して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 に答える
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 に答える