none
為什麼VB.Net的中文字轉ASCII,再轉十六進制,前面會增加"FFFF" ? RRS feed

  • 問題

  • 請問先進,

    例如在VB6,
    Hex(Asc("陳")) → 會得到正確的「B3AF」;
    如果是在VB.Net(VB 2005 Express),
    Hex(Asc("陳")) → 得到的是「FFFFB3AF」?
    為什麼會有這個FFFF??

    先謝謝先進幫忙解答~

    2007年9月13日 上午 07:20

解答

  • Asc()傳回 Integer 型別, 我想可能是 VB6 的 Integer 是 32bit, VB2005 的 Integer 是 64bit 的關係.
    在 VB2005 若用 Hex(CShort(Asc("陳"))) 就可得到"B3AF".

    雖然這個例子結果正常, 但隱約覺得其他情形可能發生例外...

    2007年9月13日 下午 04:25
  • 也可以利用Text類別中的Encoding去做轉換,.Net在這部分提供滿多方法可以用的,可以參考看看下面方式

    Code Snippet

            Dim S As String = ""
            Dim R() As Byte = System.Text.Encoding.Default.GetBytes("陳")
            For i As Integer = 0 To R.Length - 1
                If R(i) < 16 Then
                    S = S & "0" & Hex(R(i))
                Else
                    S = S & Hex(R(i))
                End If
            Next
            MessageBox.Show(S)

     

     

    Encoding傳回的會是byte的陣列,而Encoding.default會用的編碼會跟你的作業系統預設是一樣的,如果作業系統不是中文就要取得big的字碼頁再來轉 ~
    2007年9月14日 上午 01:01
    版主
  • VB6 的 Integer 是 2bytes,也就是 16 bits,VBNET 的 Integer 是 4 bytes ,也就是 32 bits 。

     

    所以為了傳回數值是相同的,必須做型別轉換

     

    基本上用 Encoding 轉換為 Bytes 在整個轉換為16進位字串是比較正確的,當碰上延伸字集也不會出錯。

     

    2007年9月14日 上午 08:01
    版主

所有回覆

  • Asc()傳回 Integer 型別, 我想可能是 VB6 的 Integer 是 32bit, VB2005 的 Integer 是 64bit 的關係.
    在 VB2005 若用 Hex(CShort(Asc("陳"))) 就可得到"B3AF".

    雖然這個例子結果正常, 但隱約覺得其他情形可能發生例外...

    2007年9月13日 下午 04:25
  • 謝謝您~

    您直接解答原因並提供很直接的解決方法,

    我想我的處理字串沒有很複雜,應該是可以..

    很感謝您!!

     

    2007年9月13日 下午 04:55
  • 也可以利用Text類別中的Encoding去做轉換,.Net在這部分提供滿多方法可以用的,可以參考看看下面方式

    Code Snippet

            Dim S As String = ""
            Dim R() As Byte = System.Text.Encoding.Default.GetBytes("陳")
            For i As Integer = 0 To R.Length - 1
                If R(i) < 16 Then
                    S = S & "0" & Hex(R(i))
                Else
                    S = S & Hex(R(i))
                End If
            Next
            MessageBox.Show(S)

     

     

    Encoding傳回的會是byte的陣列,而Encoding.default會用的編碼會跟你的作業系統預設是一樣的,如果作業系統不是中文就要取得big的字碼頁再來轉 ~
    2007年9月14日 上午 01:01
    版主
  • VB6 的 Integer 是 2bytes,也就是 16 bits,VBNET 的 Integer 是 4 bytes ,也就是 32 bits 。

     

    所以為了傳回數值是相同的,必須做型別轉換

     

    基本上用 Encoding 轉換為 Bytes 在整個轉換為16進位字串是比較正確的,當碰上延伸字集也不會出錯。

     

    2007年9月14日 上午 08:01
    版主
  • 謝謝兩位,

    您們真是熱心的人,

    很感謝您們的指點~

     

     

    2007年9月14日 上午 08:07