none
byte 轉string 問題and執行緒問題 RRS feed

  • 問題

  • 大家好~在轉型遇上一些問題~ 請大大指教

    1.下面粗體CODE那邊 MessageBox.Show(BitConverter.ToString(ss)); 這行顯示有無效的引數,我用MessageBox.Show(BitConverter.ToString(buffer));上去就可以顯示整個16進制轉STRING的畫面~ 但我想顯示的是buffer[3] 第3個byte的16進制~

    2. MyWork()這個方法 是要拿來執行前景執行緒的 讓他一直偵測讀卡機,直到有人感應之後,會顯示不同的16進制,再做判斷(無效卡還是有效卡),想請問 我用while (true) 恰當嗎?

    void MyWork()
            {
                while (true)
                {
                    sp.Open();
                    if (sp.IsOpen)
                    {
                        byte ss;
                        byte[] id1 = new byte[] { 0x7E, 0x44};
                        sp.Write(id1, 0, id1.Length);
                        Thread.Sleep(500);                   
                        byte[] buffer = new byte[1024];//1024陣列
                        //讀取刷卡資料
                        Int32 length = sp.Read(buffer, 0, buffer.Length);   
                        Array.Resize(ref buffer, length);
                        Display d = new Display(DisplayText);
                        this.Invoke(d, new Object[] { buffer });  
                        Thread.Sleep(1500);
                       
                        ss = buffer[3];                  
                        MessageBox.Show(BitConverter.ToString(ss));
                    }
                    sp.Close();
                }

            }


    2017年6月12日 上午 10:27

解答

  • ss 型別是 byte ,而 BitConverter.ToString 要傳的規範是 byte陣列。

    byte 和 byte[] 是兩個不同的型別,所以他不能吃。

    如果只是一個 byte,要轉為 16 進位字串,可以用

    Convert.ToString (ss, 16)

    另外執行緒的部分,你的  While 中有適當的 sleep ,所以應該還好 ,不過你睡得有點久,應該是不用到 1500 這麼長 

    補充一下,如果你是用 Thread class,請記得設定 IsBackground = true,不然你程式關掉後,這執行緒還會活著。


    在現實生活中,你和誰在一起的確很重要,甚至能改變你的成長軌跡,決定你的人生成敗。 和什麼樣的人在一起,就會有什麼樣的人生。 和勤奮的人在一起,你不會懶惰; 和積極的人在一起,你不會消沈; 與智者同行,你會不同凡響; 與高人為伍,你能登上巔峰。



    2017年6月12日 上午 10:57
    版主

所有回覆

  • ss 型別是 byte ,而 BitConverter.ToString 要傳的規範是 byte陣列。

    byte 和 byte[] 是兩個不同的型別,所以他不能吃。

    如果只是一個 byte,要轉為 16 進位字串,可以用

    Convert.ToString (ss, 16)

    另外執行緒的部分,你的  While 中有適當的 sleep ,所以應該還好 ,不過你睡得有點久,應該是不用到 1500 這麼長 

    補充一下,如果你是用 Thread class,請記得設定 IsBackground = true,不然你程式關掉後,這執行緒還會活著。


    在現實生活中,你和誰在一起的確很重要,甚至能改變你的成長軌跡,決定你的人生成敗。 和什麼樣的人在一起,就會有什麼樣的人生。 和勤奮的人在一起,你不會懶惰; 和積極的人在一起,你不會消沈; 與智者同行,你會不同凡響; 與高人為伍,你能登上巔峰。



    2017年6月12日 上午 10:57
    版主
  • 我剛意識到一件事,你的 sp 是 serialport 對吧 ?

    你可以參考一下這一篇
    Serial Port 系列(11) 基本篇 -- 利用執行緒讀取資料


    在現實生活中,你和誰在一起的確很重要,甚至能改變你的成長軌跡,決定你的人生成敗。 和什麼樣的人在一起,就會有什麼樣的人生。 和勤奮的人在一起,你不會懶惰; 和積極的人在一起,你不會消沈; 與智者同行,你會不同凡響; 與高人為伍,你能登上巔峰。

    2017年6月12日 下午 12:02
    版主
  • 感謝Bill Chung大大解惑~ 

    因為感覺轉型真的很多種

    有ss.ToString這種的

    (string)ss 這種

    好像還有一種是(XXX as XXX)ss

    想說土法煉鋼每個都試~ 結果是要把16進制標進去。

    執行敘的部分,反覆看大大的文章應該是能慢慢懂得~謝謝


    2017年6月12日 下午 12:08
  • 用 MemoryStream 處理 buffer ,不要用 Array.Resize ,buffer 宣告應以 sp 的接收緩衝區為依據。


    不精確的問法,就會得到隨便猜的答案;自己都不肯花時間好好描述問題,又何必期望網友會認真回答?

    2017年6月12日 下午 05:07