none
[VB2005 Express ] 請問將字串轉成 Unicode以及MidB函式 RRS feed

  • 問題

  • 大家好

    我有一個用vb6.0寫的程式片段....轉換成vb2005後....有部份的功能不能使用了

    看過詳細資訊後...還是不太清楚到底該怎麼用

    請各位高手幫我指點...(我提供了比較完整的程式碼)......謝謝賜教了

    Private Sub AxMSComm1_OnComm(ByVal sender As Object, ByVal e As System.EventArgs) Handles AxMSComm1.OnComm
            Dim t As Integer
            Dim Buf, CmdStr As String
            Dim StrPos As Short
            Dim i As Short
            Dim InBuff() As Byte
            Dim strData As String
            Dim str_Renamed As String
            Dim InNum As Short
            Dim strData1 As String

            Dim ii As Short
            Dim step1 As String
            Dim tempstring1 As String
            Dim tempstring2 As String
            Dim step2 As String
            Dim step3 As String
            Dim step4 As String
            Dim step5 As String
            Dim step6 As String
            Dim step7 As String 
            Select Case AxMSComm1.CommEvent
                Case MSCommLib.OnCommConstants.comEvCD
                Case MSCommLib.OnCommConstants.comEvCTS
                Case MSCommLib.OnCommConstants.comEvDSR
                Case MSCommLib.OnCommConstants.comEvRing
                Case MSCommLib.OnCommConstants.comEvReceive
                    If AxMSComm1.InBufferCount > 0 Then

                        InBuff = AxMSComm1.Input
                        testcom1 = System.Text.UnicodeEncoding.Unicode.GetString(InBuff)

                        For InNum = LBound(InBuff) To UBound(InBuff)
                            strData = strData & Format(Hex(InBuff(InNum)), "00")
                        Next InNum
                        strData = ByteToStr(InBuff)
                        strData = NotString(2, strData)
                        TextBox3.Text = TextBox3.Text & VB.Left(strData, 20) & Chr(32)

                        step1 = Replace(TextBox3.Text, " ", "", , , CompareMethod.Text)
                        tempstring1 = VB.Right(step1, 16)
                        tempstring2 = VB.Left(step1, 16)

                        step2 = Mid(tempstring2, 11, 2) 

                        step3 = Mid(tempstring2, 13, 4)
                        step4 = Mid(tempstring2, 9, 2) & Mid(tempstring2, 7, 2) & Mid(tempstring2, 5, 2) & Mid(tempstring2, 3, 2) & Mid(tempstring2, 1, 2) & Mid(tempstring1, 15, 2) & Mid(tempstring1, 13, 2) & Mid(tempstring1, 11, 2)
                        step5 = Mid(tempstring1, 9, 2) 
                        step6 = Mid(tempstring1, 7, 2)
                        step7 = Mid(tempstring1, 5, 2) & Mid(tempstring1, 3, 2)

                        If Len(strData) = 22 Then
                            Text2.Text = VB.Left(strData, 16) & Chr(32)
                       Else
                       'UPGRADE_ISSUE: 不支援 MidB 函式。 按一下以取得詳細資訊: 'ms-help://MS.VSExpressCC.v80/dv_commoner/local/redirect.htm?keyword="367764E5-F3F8-4E43-AC3E-7FE0B5E074E2"'
                            str_Renamed = MidB(InBuff, 3, 5)
                       'UPGRADE_ISSUE: 常數 vbUnicode 未升級。 按一下以取得詳細資訊: 'ms-help://MS.VSExpressCC.v80/dv_commoner/local/redirect.htm?keyword="55B59875-9A95-4B71-9D6A-7C294BF7139D"'
                            Text2.Text = StrConv(str_Renamed, vbUnicode)
                       End If

                        If StrConv(str_Renamed, vbUnicode) <> "Fail!" And Mid(tempstring2, 13, 4) = "0E1B" Then

                            If Len(TextBox3.Text) = 34 Then
                                TextBox1.Text = step4
     
                                baron = False
                                repbug = 1
                                AxMSComm1.PortOpen = False

                                Label3.Text = "辨識完成"
                                Exit Sub

                                TextBox3.Text = ""
                            Else
                                Command3_Click()
                                Command3_Click()
                            End If
                        Else
                            Command3_Click()
                            Command3_Click()
                        End If
                    End If
                Case MSCommLib.OnCommConstants.comEvSend
            End Select
            Exit Sub
        End Sub

    2006年7月23日 下午 04:27

解答

所有回覆

  • 觀念部份:

    你原始資料是 Byte 陣列進來,請直接用 Byte 陣列操作,在操作完之前不要轉字串,否則會掉碼。

    其它參考部份:

    取得中英文混合字串
    MyMid: http://tlcheng.twbbs.org/TLCheng/Net/NetList.aspx?Action=Function&Module=6&Function=16

    將位元組陣列轉換為字串
    BytesToString: http://tlcheng.twbbs.org/TLCheng/Net/NetList.aspx?Action=Function&Module=6&Function=55

    2006年7月24日 上午 03:38
    版主
  • 謝謝您的指導

    那現在就是想成....先把位元組陣列以UTF32格式編碼

    再用UTF32格式編碼後的位元組序列轉成Unicode字元序列

    最後將Unicode字元序列轉成字串形式........

    不過您寫的BytesToString 函數.....我看不太懂要如何下指令......以及dstCodePage這要如何用

     

    2006年7月24日 上午 09:21
  • 網址下方基本條件內有函數原始碼。

    只是 Encoding 類別的應用,你也可以直接用 Encoding 類別。

    utf[x] 中的 x 一般習慣是指所採用的 bits 數,所以有用 utf16 ,應該沒人用 utf32 ...

    處理位元陣列的時候也不需要編碼,例如你要取得原先字串 MidB 函數的 nStart, nLen 位址,只要用 Array.Copy 就可以了,所得到的 Byte Array 直接透過 Encoding 類別依據原先編碼轉回 Unicode (例如 big5) ,不太清楚為何要先把位元組陣列編碼。

    2006年7月24日 上午 09:40
    版主