none
解碼疑問 RRS feed

  • 問題

  • 我用visual C# 2008寫下面解碼程式,我是使用了UTF7Encoding u7先將InputData字串編碼成位元陣列,再用BitConverter做解碼動作,可是我在執行時,在 SetText(str)這邊顯示出來的數據都是00000,想請教一下高手是因為我的解碼指令不適用嗎?  

     

            private void port_DataReceived_1(object sender, SerialDataReceivedEventArgs e)

            {

                string InputData = String.Empty;

                InputData = port.ReadExisting();

     

                UTF7Encoding u7 = new UTF7Encoding(true);

                byte[] mydata = new byte[u7.GetByteCount(InputData)];

     

                string str = BitConverter.ToString(mydata);

                string str1;

                str = BitConverter.ToString(mydata).Replace("-", "");

                int [] num=new int [701];

                string a = null;

                for(int i=0; i<=51 ; i++)

                {

                num[i] =System.Convert.ToInt32(mydata[i]);

                str1 = num[i].ToString();

                a = string.Concat(a, str1, " ");

                SetText(str);

                }

    2010年5月23日 上午 08:00

解答

所有回覆

  • 不是很瞭解你這樣做的原因, 不如這麼說好了,

    (1) 設備端發給你的訊息是何種 ? 如果不是純粹的文字訊息, 那用 Serialport.Read or Readbyte 才對

    (2) 你為何要Encoding為UTF-7 ? 是因為設備端的編碼方式為UTF-7嗎 ?

    (3) 你想顯示出來的結果為何 ?

         (a) 十六進位顯示 : ex:  00 09 FF 27 F5 A4 ...

         (b) 文字顯示 : This is a message from ....

    (4) 請儘量詳述


    以下是簽名檔, 請勿沒事對號入座
    MSDN 文件庫很重要
    回應幫助你的人是一種禮貌, 良好的禮貌有助於激發大家對你問題回應的熱情
    進步的人會找尋自己程式中的缺點,半桶水則把自己程式的錯誤推到不相干事物的身上
    2010年5月23日 上午 08:18
    版主
  • (1) 設備端發給你的訊息是何種 ? 如果不是純粹的文字訊息, 那用 Serialport.Read or Readbyte 才對

      設備端給我的訊息是數字非文字,你是說用Readbyte? 我之前有用過>>我是這樣寫

               string InputData = String.Empty;

                InputData = port.Readbyte();>>>可是這邊會顯示錯誤  好像是int與int[]不通,我有去看過Readbyte的解說,一直不是很懂說>_<

    (2) 你為何要Encoding為UTF-7 ? 是因為設備端的編碼方式為UTF-7嗎 ?

          我有點不太了解設備端部分,學長有要我換成Readbyte,我有是過可是換不太過去,有去查資料一直不是很懂,我是新手剛接觸這個

    (3) 你想顯示出來的結果為何 ?

         (a) 十六進位顯示 : ex:  00 09 FF 27 F5 A4 ...

         (b) 文字顯示 : This is a message from ....

         我想要顯示的是(a)十六進位顯示: ex: FF 00 09 27>>但是最後還要將這些東西解碼成十進位例如:FF=256這樣

         之前我有寫其他指令測試過,解碼出來的數字並不是對的>_<

    2010年5月23日 上午 08:48
  • 你可以用Serialport.Read() 中的 SerialPort. Read 方法 (Byte [] , Int32, Int32)
    以下是MSDN上的參數說明, 其實就是讀回來的Byte陣列會丟進buffer中, offset一般都是0, count則是你要讀的長度有多少

    參數

    buffer
    型別:array< System. . :: . Byte > [] () []

    要寫入輸入的位元組陣列。

    offset
    型 別:System. . :: . Int32

    緩 衝區陣列中要開始寫入的位移。

    count
    型別:System. . :: . Int32

    要 讀取的位元組數。

    傳回值

    型別:System. . :: . Int32

    讀 取的位元組數目。

    所以當你用 Read讀回來後, 只要將Byte陣列的每個元素使用 Convert.ToString 方法 (Byte, Int32) 就可以轉出你要的結果 (基底為16)

    以下文章有一個Serialport的範例程式, 你可以下載來看

    http://www.dotblogs.com.tw/billchung/archive/2009/04/12/7981.aspx


    以下是簽名檔, 請勿沒事對號入座
    MSDN 文件庫很重要
    回應幫助你的人是一種禮貌, 良好的禮貌有助於激發大家對你問題回應的熱情
    進步的人會找尋自己程式中的缺點,半桶水則把自己程式的錯誤推到不相干事物的身上
    • 已標示為解答 瑞特 2010年5月23日 下午 01:01
    2010年5月23日 上午 09:03
    版主
  • 我個人也是偏向 Read(Byte[], , ) ,這才是最相容的正統的作法。

    我最討厭用 ReadExisting 的,雖然說存在就是有道理,但是這個使用時機應該是屬於特例狀態,建議你把線上手冊這個方法的備註看懂。

    我自己情願自己用 Byte[] 轉回字串,我也絕不用 ReadExisting 。

     


    論壇是網友平等互助 保證解答請至 微軟技術支援服務
    提問時,錯誤情境描述與錯誤訊息很重要,情境描述包含你做了什麼,預期的結果與實際發生的結果。一個最爛的問法範例:「我的電腦電腦怎麼不能開機?」誰知道你家是不是沒電還是你根本找不到電源鈕。
    2010年5月23日 下午 12:31
  • 恩 謝謝
    2010年5月23日 下午 12:57
  • 所以說裡面的部分要在之前就先設'定好囉!!

    我想問的是之前我所宣告的部分就是:

     string InputData = String.Empty;>>>此處也要更改囉?

    nputData = port.Readbyte();

    因為我記得Readbyte我看到的資料是int形式

     

    先謝謝你的解說

    2010年5月23日 下午 01:01
  • ReadByte回傳是Integer沒錯, 不過你用Read會方便一點. 因為用ReadByte通常要配合迴圈或遞迴方式處理

     


    以下是簽名檔, 請勿沒事對號入座
    MSDN 文件庫很重要
    回應幫助你的人是一種禮貌, 良好的禮貌有助於激發大家對你問題回應的熱情
    進步的人會找尋自己程式中的缺點,半桶水則把自己程式的錯誤推到不相干事物的身上
    2010年5月23日 下午 01:36
    版主
  • 我想請教一下ReadByte的部分,如果我用這個個指令去寫

    那我之前設定跟宣告的需要改嗎? 如

     

    string InputData = String.Empty;>>這個部分

    以及解碼時可以用BitConverter指令嗎? 還是要改回 Convert.ToString 此指令呢?

    很謝謝你提供的範例 可是它是VB程式, 轉到VC#有些會卡卡不太懂

     

    不過很謝謝你的提供 只是順便一題問一下SerialPort. Read 方法 (Byte [] , Int32, Int32) >>可以寫成int InputData = port.Read;這樣嗎?

    2010年5月23日 下午 02:50
  • 你若是要用 Byte[] 轉 String ,請直接用 Encoding 類別,要轉 utf7 請先看 GetEncoding 的方法。
    論壇是網友平等互助 保證解答請至 微軟技術支援服務
    提問時,錯誤情境描述與錯誤訊息很重要,情境描述包含你做了什麼,預期的結果與實際發生的結果。一個最爛的問法範例:「我的電腦電腦怎麼不能開機?」誰知道你家是不是沒電還是你根本找不到電源鈕。
    2010年5月23日 下午 02:57
  • 恩恩.......了解  

     

    Read的部分他會有一個BytetoRead的指令是在Read下必用的嗎?

    因為範例是VB程式要將它的概念轉成VC# 對我新手來講有時會搞不懂   

    是否請一下有比較偏VC#的嗎? 我有去連接Rread的資料有點不懂

    我是不是將 string InputData = String.Empty;

                InputData = port.ReadExisting();

    改寫成

                  int InputData=Port. Read()?

    那之後還需要再寫一個byte[]陣列嗎?還是那樣舊是一個位元陣列了?

    直接用 Convert.ToString 去解嗎?

    2010年5月23日 下午 06:02
    • 已標示為解答 瑞特 2010年5月24日 上午 02:14
    2010年5月24日 上午 01:23
  • 感恩....之前我在藍色有看過不是很懂

     

    不過謝謝大家跟我解說這麼多 我發現對一些程式可以了解了  

     

    謝謝大家

    2010年5月24日 上午 02:14
  • 基本上應該這樣講. Serialport在讀取資料部份粗略可分為幾種方法

    1. Readline

    2. ReadExisting

    3. Read

    4. ReadByte

    5. ReadChar

    其中只有Read方法不是將所獲取的資料以回傳值方式傳遞.

     


    以下是簽名檔, 請勿沒事對號入座
    MSDN 文件庫很重要
    回應幫助你的人是一種禮貌, 良好的禮貌有助於激發大家對你問題回應的熱情
    進步的人會找尋自己程式中的缺點,半桶水則把自己程式的錯誤推到不相干事物的身上
    2010年5月24日 上午 02:55
    版主
  • 謝謝你 我大致了解了 

    想在請教一下BytesToRead也是Read的寫法一種?

    2010年5月24日 上午 07:19
  • BytesToRead當然不是, 我列的全部都是方法 (Method), 而BytesToRead是個屬性 (Property)

    SerialPort. BytesToRead 屬性

     


    以下是簽名檔, 請勿沒事對號入座
    MSDN 文件庫很重要
    回應幫助你的人是一種禮貌, 良好的禮貌有助於激發大家對你問題回應的熱情
    進步的人會找尋自己程式中的缺點,半桶水則把自己程式的錯誤推到不相干事物的身上
    2010年5月24日 下午 01:48
    版主
  • 恩 我原本也有想到ByteToRead

    不過後來還是用了你們建議的Read或是Readbyte

    謝謝了

    2010年5月24日 下午 03:54