2013-02-12 59 views
2

背景點點先上我的目標[4]一個字節數組,然後我會告訴你我的代碼和方法,我目前來看作爲在這個時刻最好的辦法。構建使用個體值/變量

我的目標:我有,我有存儲5個值,我想創建這些值的字節數組

我有以下命令在我的應用程序中使用硬編碼Microsoft.PointOfService一個XML文件:

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中的值(我已經讀成目前的一類),並建立一個字節數組,然後我就可以只搶字節數組(可以是靜態的,更可能將是我的單身班)那麼這將是工作完成:)

任何想法帥哥dudettes?

非常感謝:)

+0

你試過它?它是做你想做的嗎? (它看起來應該)。在一般情況下,這樣的問題「的任何想法」會被認爲是「題外話」:http://stackoverflow.com/faq#dontask – 2013-02-12 21:57:39

+1

你在使用「字節1」,「字節2」設置,...命名約定? – JerKimball 2013-02-12 22:04:41

+0

既然你只是把字節數組,你從XML獲得和做'System.Text.ASCIIEncoding.ASCII.GetString(字節陣列)',那豈不是更有意義只是爲了把ASCII字符串作爲一個字段XML文件,而不是整數字符的字節? – 2013-02-12 22:55:33

回答

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(); 

然後你去了。如果我遇到了一些小錯誤,你可以修復它。

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> 
+0

謝謝你的時間JerKimball調查這個問題..非常感謝:) – Kev 2013-02-13 14:40:20