none
byte array轉string 顯示問題 RRS feed

  • 問題

  • 我想將一個bmp檔轉成string再把他轉hex,但是在轉成string在messagebox顯示時問題就發生了,只顯示前面的值後面就沒了

    因為我還不能PO圖所以概述一下

    我認為messagebox要顯示:

    BM跋     6   (   `          €[                     ...等等

    實際上messagebox顯示:

    BM跋  //只顯示BM跋就沒了為什麼會這樣


    程式碼部分:

                        // 先將圖檔讀到FileStream, 再轉換為byte array。
                        demo_string = a123fileName;//路徑
                        FileStream fs = new FileStream(demo_string, FileMode.Open);
                        byte[] buffer = new byte[fs.Length];
                        fs.Read(buffer, 0, buffer.Length);
                        String s = fs.Length.ToString(); //1399734
                        MessageBox.Show("bytes of length 有: "+s+" 個");//messagebox顯示bytes of length 有: 1399734個
                        String s1 = System.Text.Encoding.Default.GetString(buffer);
                        MessageBox.Show(s1);
                        fs.Close();


    請問是什麼原因造成的,我又該往哪個方向去解

    如果有重複發問的話,麻煩請告知

    2016年12月15日 上午 07:52

解答

  • Encoding.GetString() 是把可轉成字串的位元陣列值轉回字串用的,不是什麼都可以轉好嗎...

    如果你要做 Hex 顯示,可以參考:http://stackoverflow.com/questions/311165/how-do-you-convert-byte-array-to-hexadecimal-string-and-vice-versa

    另外,用 MessageBox 顯示 Hex String 也是一件令人匪夷所思的事... 為什麼不用文字方塊或是乾脆寫成文字檔...


    強力監督SQL Injection問題!!

      • 小朱的技術隨手寫:http://www.dotblogs.com.tw/regionbbs/
      • 雲端學堂Facebook: http://www.facebook.com/studyazure

    • 已標示為解答 CS_NOOB 2016年12月15日 上午 09:43
    2016年12月15日 上午 08:56
    版主

所有回覆

  • 只要遇到 byte 值是 00,後面就全掛了.

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

    2016年12月15日 上午 07:55
    版主
  • 請問一下如果我真的想列印出這1399734個值,我應該要怎麼做。

    請給我個方向,謝謝

    2016年12月15日 上午 08:01
  • 您那是圖檔轉成即使轉的出來也是亂碼,

    您要看到的是亂碼?

    您可以先把 \0 字串去掉,如下

    var s1 = String.Concat(System.Text.Encoding.Default.GetString(buffer)
                            .Where(c => c != 0x00));


    亂馬客blog: http://www.dotblogs.com.tw/rainmaker/


    • 已編輯 亂馬客 2016年12月15日 上午 08:31 add code
    2016年12月15日 上午 08:21
  • 基本上我覺得把這個用 Encoding 的方式轉成 String 就已經是個匪夷所思的事情了。有甚麼必要需要這樣做 ?

    修改補充: 你要印出值,正確的方式應該是轉 Hex 字串來印出
    如何:在十六進位字串和數字類型間轉換 (C# 程式設計手冊)


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




    2016年12月15日 上午 08:51
    版主
  • Encoding.GetString() 是把可轉成字串的位元陣列值轉回字串用的,不是什麼都可以轉好嗎...

    如果你要做 Hex 顯示,可以參考:http://stackoverflow.com/questions/311165/how-do-you-convert-byte-array-to-hexadecimal-string-and-vice-versa

    另外,用 MessageBox 顯示 Hex String 也是一件令人匪夷所思的事... 為什麼不用文字方塊或是乾脆寫成文字檔...


    強力監督SQL Injection問題!!

      • 小朱的技術隨手寫:http://www.dotblogs.com.tw/regionbbs/
      • 雲端學堂Facebook: http://www.facebook.com/studyazure

    • 已標示為解答 CS_NOOB 2016年12月15日 上午 09:43
    2016年12月15日 上午 08:56
    版主
  • 您那是圖檔轉成即使轉的出來也是亂碼,

    您要看到的是亂碼?

    您可以先把 \0 字串去掉,如下

    var s1 = String.Concat(System.Text.Encoding.Default.GetString(buffer)
                            .Where(c => c != 0x00));


    亂馬客blog: http://www.dotblogs.com.tw/rainmaker/



    這個情境不應該這樣做吧 ?

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

    2016年12月15日 上午 09:02
    版主
  • 在 .Net 中,所有 String 必須為指定編碼內的字串,如果有不是的內容,會被放棄,造成缺值。所以一長串字串中,會包含多個缺值部分。

    因此二進位的 byte[] 不適合轉換為 String 。

    轉 hex 請直接針對 byte 轉換,就可以完成 byte[] 轉換為 hex 字串。


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

    2016年12月15日 下午 05:32