none
想請問中文字跟ASCII 互轉問題(新增問題) RRS feed

  • 問題

  • 我有看這篇 文章
    http://social.msdn.microsoft.com/Forums/zh-TW/232/thread/35d324a7-df8b-4980-89c0-b50f0205b4d7/

    他這個文章是 把 中文字串轉 ASCII 16進位

    那如果 在從 16 進位轉回去中文字 不知是否可行呢?

    請前輩們解答,謝謝



    • 已編輯 來可因 2009年11月7日 下午 02:43
    2009年11月7日 上午 06:09

解答

  • 一樣沿用那一篇的 Encoding類別
    請參閱 MSDN文件庫
    [Encoding 類別 ]
    [Encoding. GetString 方法 ]

    ex:
      mystring=System.Text.Encoding.GetEncoding(950).GetString(myByte)
     
    其中myByte是中文字的Big5 碼Byte陣列
    學而不思則罔, 思而不學則殆.
    如果你一直都看不懂、不想學習看懂、抗拒看懂MSDN Library的話,那你最好放棄想要寫好程式這件事
    如果你自私地不肯回饋與分享,那別人為何要花時間回答你的問題?
    • 已標示為解答 來可因 2009年11月7日 上午 11:00
    2009年11月7日 上午 06:54
    版主
  • 你抓的Byte數怪怪的.  [7]南國的小紅豆:  只有10個字為什麼會跑出 16次 ?

    另一個問題是 你的迴圈這樣寫  For MBASE = MBASE To MBASE + 32 非常的奇怪, 一般不會在 = 左右邊用相同的變數

    我用UTF32 去跑這10個字出來的應該如下 (10進位)

    [            7             ]             南            國            的                 小           紅             豆              :
    91 0 0 0 ,55 0 0 0 ,93 0 0 0 ,87 83 0 0 ,11 87 0 0 ,132 118 0 0 ,15 92 0 0 ,5 125 0 0 ,70 140 0 0 ,58 0 0 0


    所以你的程式碼一定是在處理Byte陣列時有錯誤


    學而不思則罔, 思而不學則殆.
    如果你一直都看不懂、不想學習看懂、抗拒看懂MSDN Library的話,那你最好放棄想要寫好程式這件事
    如果你自私地不肯回饋與分享,那別人為何要花時間回答你的問題?
    • 已標示為解答 來可因 2009年11月8日 上午 08:21
    2009年11月8日 上午 07:08
    版主

所有回覆

  • 一樣沿用那一篇的 Encoding類別
    請參閱 MSDN文件庫
    [Encoding 類別 ]
    [Encoding. GetString 方法 ]

    ex:
      mystring=System.Text.Encoding.GetEncoding(950).GetString(myByte)
     
    其中myByte是中文字的Big5 碼Byte陣列
    學而不思則罔, 思而不學則殆.
    如果你一直都看不懂、不想學習看懂、抗拒看懂MSDN Library的話,那你最好放棄想要寫好程式這件事
    如果你自私地不肯回饋與分享,那別人為何要花時間回答你的問題?
    • 已標示為解答 來可因 2009年11月7日 上午 11:00
    2009年11月7日 上午 06:54
    版主
  • 謝謝你的回答...^_^ 感謝
    2009年11月7日 上午 11:00
  • 目前有一個新的問題...
    我用  Notepad 做測試.
    不知道 notepad 是 什麼格式
    同樣的一個  陳 字 到了
    notepad 的 ascii 碼就不相同
    會變成 73 96
    如果 把 73 96 改成  B3 AF 會變成 Notepad 那邊的文字變成亂碼..

    不知道是否我程式碼有寫錯
    ===
            Dim buffer_x As Byte() = {lpBuffer}
            For MBASE = MBASE To MBASE + 128

                ReadProcessMemory(MyProcessHandle, MBASE, lpBuffer, 1, 0)


                mystring = System.Text.Encoding.GetEncoding(950).GetString(New Byte() {lpBuffer})


                TextBox1.Text = TextBox1.Text + mystring.ToString

            Next
    2009年11月7日 下午 02:57
  • 你抓到的 73, 96 應該是十六進位值吧 ? 換成10進位是 115, 150 (提醒一點, 以後這樣最好註明它的進位法, 不然要花時間猜)
    這個Encoding的格式應該是Unicode

    Dim myByte(1) As Byte
    myByte(0) = 115
    myByte(1) = 150
    TextBox2.Text = System.Text.Encoding.Unicode.GetString(myByte)

    另外提醒: 如果你要玩這個類別, 好好把 [Encoding 類別 ] 的相關連結仔細研讀, 對你會非常有幫助

    學而不思則罔, 思而不學則殆.
    如果你一直都看不懂、不想學習看懂、抗拒看懂MSDN Library的話,那你最好放棄想要寫好程式這件事
    如果你自私地不肯回饋與分享,那別人為何要花時間回答你的問題?
    2009年11月7日 下午 03:25
    版主
  • 嗯嗯 先謝謝前輩的回答

    目前是真的讀取出來了,我也大概知道為何我總是讀取不了中文字.
    但是 相對性的又延伸出另外的問題


    程式碼如下
    ====
            For MBASE = MBASE To MBASE + 32
      
                ReadProcessMemory(MyProcessHandle, MBASE, lpBuffer, 2, 0)
                ReadProcessMemory(MyProcessHandle, MBASE, lpBuffer2, 1, 0)

                Dim xxx1 As Byte() = BitConverter.GetBytes(lpBuffer)
                Dim xxx2 As Byte() = BitConverter.GetBytes(lpBuffer2)

                If lpBuffer < 255 Then

                    mystring = System.Text.Encoding.ASCII.GetString(xxx2)
                    TextBox1.AppendText(mystring)
                Else

                    mystring = System.Text.Encoding.Unicode.GetString(xxx1)
                    TextBox1.AppendText(mystring)
                End If

    ===
    這是我 判斷的方式 , 用中斷去看過,想做混和讀取
    發現如果一次讀取 2 byte 是可以讀取出中文字串 但如果遇到 1 byte 的英文字串 會因為後面的 16進位 是 "00" 導致變成中文字出現
    或者 一個方框
    也嘗試把 unicode 改成 getcodeing(950) 會導致只讀取 1 byte 變成中文字又讀不出來.
    2009年11月8日 上午 01:23
  • 你一樣用System.Text.Encoding.Unicode.GetString就可以了. 為何要分成兩個不同的程序 ?
    英文在此格式下一樣會變成2Bytes
            myByte(0) = 115
            myByte(1) = 150
            myByte(2) = 65
            myByte(3) = 0
            TextBox2.Text = System.Text.Encoding.Unicode.GetString(myByte)

    這結果就是"陳A"

    學而不思則罔, 思而不學則殆.
    如果你一直都看不懂、不想學習看懂、抗拒看懂MSDN Library的話,那你最好放棄想要寫好程式這件事
    如果你自私地不肯回饋與分享,那別人為何要花時間回答你的問題?
    2009年11月8日 上午 01:32
    版主
  • 還是用圖說明比較方便

     

    2009年11月8日 上午 04:01
  • 你直接把 xxx1的Byte陣列內容貼上來看看
    學而不思則罔, 思而不學則殆.
    如果你一直都看不懂、不想學習看懂、抗拒看懂MSDN Library的話,那你最好放棄想要寫好程式這件事
    如果你自私地不肯回饋與分享,那別人為何要花時間回答你的問題?
    2009年11月8日 上午 04:53
    版主
  • xxx1 的陣列內容就是 lpbuffer 內的東西.
    如果取 1 byte 那英文、數字絕對正常顯示
    如果取 2 byte 中文是可以顯示,但也會影響到 英文、 數字
    我那個圖蓋掉的 都是 我自己的註解,所以整個程式碼就是那樣子而已

    Mbase 位置, 就是 &HC518A
    lpbuffer 就是右邊那個視窗內的顯示 16 進位碼

    且System.Text.Encoding.Unicode.GetString(xxx1)
    GetSring 必須要 1維陣列
    然而 lpbuffer 讀出來的沒轉換過的話,就是我設定Integer  (本來設定 byte , 但是 遇到雙字元的中文字 會導致溢位,才改掉)


    BitConverter.GetBytes(lpBuffer)
    這個是把Integer 轉成 byte
    2009年11月8日 上午 05:41
  • 你只要把 xxx1陣列內容和lpbuffer的內容列上來就好. 你這樣說我也看不出個所以然.

    這麼說好了, 我要知道 [7]南國的小紅豆: 這段文字你抓出來的Byte內容

    學而不思則罔, 思而不學則殆.
    如果你一直都看不懂、不想學習看懂、抗拒看懂MSDN Library的話,那你最好放棄想要寫好程式這件事
    如果你自私地不肯回饋與分享,那別人為何要花時間回答你的問題?
    2009年11月8日 上午 05:45
    版主
  • 列出來. 我用中斷去看 .
    設置中斷點在

            TextBox2.Text = System.Text.Encoding.Unicode.GetString(myByte)

    .如下
    跑的次數
    1.
    -        xxx1    {Length=&H4}    Byte()
            (&H0)    &H5B    Byte
            (&H1)    &H0    Byte
            (&H2)    &H0    Byte
            (&H3)    &H0    Byte
            lpbuffer    &H5B    Integer
    -        mystring    "[ {String}    Object
    +        String    "[ {String}    Object
    -----------
    2.
    -        xxx1    {Length=&H4}    Byte()
            (&H0)    &H0    Byte
            (&H1)    &H37    Byte
            (&H2)    &H0    Byte
            (&H3)    &H0    Byte
            lpbuffer    &H3700    Integer
    -        mystring    "㜀 {String}    Object  <==這邊在我電腦上顯示的是一個方框
            String    "㜀    String
    -----------
    3.
    -        xxx1    {Length=&H4}    Byte()
            (&H0)    &H37    Byte
            (&H1)    &H0    Byte
            (&H2)    &H0    Byte
            (&H3)    &H0    Byte
            lpbuffer    &H37    Integer
    -        mystring    "7 {String}    Object
            String    "7    String
    -----------
    4.
    -        xxx1    {Length=&H4}    Byte()
            (&H0)    &H0    Byte
            (&H1)    &H5D    Byte
            (&H2)    &H0    Byte
            (&H3)    &H0    Byte
            lpbuffer    &H5D00    Integer
    -        mystring    "崀 {String}    Object
            String    "崀    String

    -----------
    5.
    -        xxx1    {Length=&H4}    Byte()
            (&H0)    &H5D    Byte
            (&H1)    &H0    Byte
            (&H2)    &H0    Byte
            (&H3)    &H0    Byte
            lpbuffer    &H5D    Integer
    -        mystring    "] {String}    Object
            String    "]    String

    -----------
    6.
    -        xxx1    {Length=&H4}    Byte()
            (&H0)    &H0    Byte
            (&H1)    &H57    Byte
            (&H2)    &H0    Byte
            (&H3)    &H0    Byte
            lpbuffer    &H5700    Integer
    -        mystring    "圀 {String}    Object
            String    "圀    String

    -----------
    7.
    -        xxx1    {Length=&H4}    Byte()
            (&H0)    &H57    Byte
            (&H1)    &H53    Byte
            (&H2)    &H0    Byte
            (&H3)    &H0    Byte
            lpbuffer    &H5357    Integer
    -        mystring    "南 {String}    Object
            String    "南    String

    -----------
    8.
    -        xxx1    {Length=&H4}    Byte()
            (&H0)    &H53    Byte
            (&H1)    &HB    Byte
            (&H2)    &H0    Byte
            (&H3)    &H0    Byte
            lpbuffer    &HB53    Integer
    -        mystring    "୓ {String}    Object
            String    "୓    String

    -----------
    9.
    -        xxx1    {Length=&H4}    Byte()
            (&H0)    &HB    Byte
            (&H1)    &H57    Byte
            (&H2)    &H0    Byte
            (&H3)    &H0    Byte
            lpbuffer    &H570B    Integer
    -        mystring    "國 {String}    Object
            String    "國    String

    -----------
    10.
    -        xxx1    {Length=&H4}    Byte()
            (&H0)    &H57    Byte
            (&H1)    &H84    Byte
            (&H2)    &H0    Byte
            (&H3)    &H0    Byte
            lpbuffer    &H8457    Integer
    -        mystring    "著 {String}    Object
            String    "著    String
    -----------
    11.
    -        xxx1    {Length=&H4}    Byte()
            (&H0)    &H84    Byte
            (&H1)    &H76    Byte
            (&H2)    &H0    Byte
            (&H3)    &H0    Byte
            lpbuffer    &H7684    Integer
    -        mystring    "的 {String}    Object
            String    "的    String
    -----------
    11.
    -        xxx1    {Length=&H4}    Byte()
            (&H0)    &H76    Byte
            (&H1)    &HF    Byte
            (&H2)    &H0    Byte
            (&H3)    &H0    Byte
            lpbuffer    &HF76    Integer
    -        mystring    "ྲྀ {String}    Object
            String    "ྲྀ    String

    -----------
    12.
    -        xxx1    {Length=&H4}    Byte()
            (&H0)    &HF    Byte
            (&H1)    &H5C    Byte
            (&H2)    &H0    Byte
            (&H3)    &H0    Byte
            lpbuffer    &H5C0F    Integer
    -        mystring    "小 {String}    Object
            String    "小    String

    -----------
    13.
    -        xxx1    {Length=&H4}    Byte()
            (&H0)    &H5C    Byte
            (&H1)    &H5    Byte
            (&H2)    &H0    Byte
            (&H3)    &H0    Byte
            lpbuffer    &H55C    Integer
    -        mystring    "՜ {String}    Object
            String    "՜    String

    -----------
    14.
    -        xxx1    {Length=&H4}    Byte()
            (&H0)    &H5    Byte
            (&H1)    &H7D    Byte
            (&H2)    &H0    Byte
            (&H3)    &H0    Byte
            lpbuffer    &H7D05    Integer
    -        mystring    "紅 {String}    Object
            String    "紅    String

    -----------
    15.
    -        xxx1    {Length=&H4}    Byte()
            (&H0)    &H7D    Byte
            (&H1)    &H46    Byte
            (&H2)    &H0    Byte
            (&H3)    &H0    Byte
            lpbuffer    &H467D    Integer
    -        mystring    "䙽 {String}    Object
            String    "䙽    String

    -----------
    16.-        xxx1    {Length=&H4}    Byte()
            (&H0)    &H46    Byte
            (&H1)    &H8C    Byte
            (&H2)    &H0    Byte
            (&H3)    &H0    Byte
            lpbuffer    &H8C46    Integer
    -        mystring    "豆 {String}    Object
            String    "豆    String

    -----------
    2009年11月8日 上午 06:49
  • 你抓的Byte數怪怪的.  [7]南國的小紅豆:  只有10個字為什麼會跑出 16次 ?

    另一個問題是 你的迴圈這樣寫  For MBASE = MBASE To MBASE + 32 非常的奇怪, 一般不會在 = 左右邊用相同的變數

    我用UTF32 去跑這10個字出來的應該如下 (10進位)

    [            7             ]             南            國            的                 小           紅             豆              :
    91 0 0 0 ,55 0 0 0 ,93 0 0 0 ,87 83 0 0 ,11 87 0 0 ,132 118 0 0 ,15 92 0 0 ,5 125 0 0 ,70 140 0 0 ,58 0 0 0


    所以你的程式碼一定是在處理Byte陣列時有錯誤


    學而不思則罔, 思而不學則殆.
    如果你一直都看不懂、不想學習看懂、抗拒看懂MSDN Library的話,那你最好放棄想要寫好程式這件事
    如果你自私地不肯回饋與分享,那別人為何要花時間回答你的問題?
    • 已標示為解答 來可因 2009年11月8日 上午 08:21
    2009年11月8日 上午 07:08
    版主
  • 前輩還是謝謝你的說法
    不過我剛好自己又解決了

    且解決的地方就是在你說的,很奇怪的 迴圈設制.
    For MBASE = MBASE To MBASE + 32

    我改成 如下
    For MBASE = MBASE To MBASE + 32 step 2

    就一且全部正常. 也不會在讀取有空白的地方

    我知道一般的設計 應該是
        Dim M_Chg() As Byte = {&HC8, &H41, &H56, &HE}
               For i = 0 To M_Chg.Length - 1

    這樣的設計
    但是這種的設計 是對「已知數量」才有辦法這樣做

    如果遇上 未知數量 的變數 就變成這種很奇怪的設定
    會這樣設計是 因為要把 Mbase 的位置, 往下讀取要不然只會在設定的那個位置 讀取,不會往下讀取
    這是我自己也覺得很詭異的設定 , 且還可以正常的跑

    不過還是很謝謝前輩
    2009年11月8日 上午 08:21