我想应该用 
dim char as string
dim s() as bytex = Len(instring)
redim s(x-12)
for i=0 to x-12
s(i)=val("&H" & Mid(instring, 12, i))
nextchar=strconv(s,vbUnicode)

解决方案 »

  1.   

    word=chrw(trim(Mid(instring, 12, x))
      

  2.   

    这里传输过来的是16进制
    你必须先把“测”也就是6d4b取出来,然后将它们转化成十进制
    “测”的十进制为27979,然后用word=CHRW("27979"),这样word就等于“测”了,明白吗,就是必须4位 4位的取出来转换成二进制
    所以你首先必须定义一个数组用来保存取出来的4位,然后将它们全部转换成二进制,再用循环将它们一一转换回来,就可以得到你所要的中文字了
      

  3.   

    16进制转换成10进制,就可以了,不必转换成2进制,上面写错了
    转化关系
    27979=11+4*16+13*256+6*256*16
    b为11,d为13
    说到这里,你可以用个CASE 语句
    比如 case "a"
         num=10
         case "b"
         num=11
         ..........
        将它们全部转换成十进制在用算法
     呵呵明白了吗?
      

  4.   

    还是不行,我的程序运行后,我在text1.text=word里显示出来的是个奇怪的字符:mK婨,在实际应用中,我不知道对方的消息的内容,我该如何取出unicode码那部分内容,并将它显示出来呢?
    希望大家帮忙解决呀,我的MSComm1.InputMode = comInputModeText,我应该怎么转换呀?
      

  5.   

    把汉字转换成ASCII码传过去,接到后再把它转化过来
      

  6.   

    不可以的,对方只能以unicode码,发送,我该怎么处理呀
      

  7.   

    不管他传送什么东西来,你都可以将他转化成十进制啊
    这些都需要通过编写算法来实现,我上面只是用“测”
    来举个列子而已
    那有这么简单的
    我自己编写这些算法花了我3天的时间
    我不知道在你那里为什么接不到,
    在我这里是能够收到正确的中文的
    你需要完成如下的算法:
    1:将传送过来的16进制,每4位用一个字符串数组存储
    2:将4位16进制里面的含有"A","B",.....这些字符用十进制表示
    3:之后,比如这4位为"xyzv"(已经转换为十进制后的数),转换函数为
       totoal=x*16*16*16+y*16*16+z*16+v
    4:用CHRW(“TOTOAL”)就可以得到中文了
    注意:这上面的算法里面有些可能需要用到另外一些小函数,自己再好好编一下这些算法
      

  8.   

    上面的4:用chrw(totoal) 写错,呵呵
    我在机子上这样写的一特小段测试代码 测试成功
    Dim total As Long
    Dim str1 As String, str2 As String
    str1 = "6d4b"
    total = 6 * 256 * 16 + 13 * 256 + 4 * 16 + 11
    str2 = total
    str1 = ChrW$(total)
    Text1.Text = str1
    运行后text1.text 上面就是中文 “测”字
      

  9.   

    请你告诉我,以我的程序,我怎么能将对方传过来的16进制的数据,用16进制存在一个字符串呀。我的程序运行后,我不会将接受的数据还原为16进制,就是:text1.text=aa0331333931303734323331346d4b8b45   你能告诉我怎么做吗?以我的程序为例,你可以运行我的程序
    多谢了
      

  10.   

    (1)直接发送
    直接发送即把中文字符等同于英文字符。如:MSComm1.Intput= " 这是一行中文数据!" ,但这种方法发送的中文数据不能太长,发送缓冲区和接收缓冲区的大小需设定为中文字符的两倍以上,而且发送与接收系统所处的操作系统版本最好要一致,否则会出现接收或发送缓冲区溢出之类的错误。这种方法时用于一般要求不太高的场合。
    (2)间接发送
    在发送端将汉字或字符转换为机器内码或区位码数据数组,然后将咏转换后的数据发送到串口,在接收端接收到数据后,按照相反的顺序得到的数据转换为相应的汉字或字符,在转换过程中.要用到位运算,如取得汉字的内码后需要将高字节和低字节分开,VB6.0中并没有提供此类函数,以下是求整数高、低字订的函数。
    Public Function HiByte(a As Integer ) 
    Dim b
    b= a And &HFF00
    b = b / 256
    If b<0 Then b = b + 256
    HiByte = b
    End FunctionPublic Function LowByte(a As Integ`er)
    Dim b
    b = a And &HFF
    LowByte = b
    End Function
      

  11.   

    我这里”测试"的unicode码
        不是 6d4b8b45
        而是 6d4b8bd5
    传错了吧    Dim strResult As String
        Dim strOrigin As String
        strOrigin = "6d4b8bd5"
        Do While Len(strOrigin) > 0
            strResult = strResult & ChrW(CLng("&H" & Left(strOrigin, 4)))
            strOrigin = Right(strOrigin, Len(strOrigin) - 4)
        Loop
        MsgBox strResult
      

  12.   

    chen22(chen22) :"CLng()"这个东东我没有用过,讲讲吧!
      

  13.   

    我这里的测试的uncide码是6d4b8bd5
    下面是我按照你的程序编的程序:
    '下面的程序,只是简单的只取发送过来的中文内容
    '其他的只是把取的字符串变成你所要取的就行
    '首先你得确定计算机收到的就是这个串,我这里没有这种发信息的工具
    '所以只能手工设置它了。
    instring = "aa0331333931303734323331346d4b8bd5"Dim byte1()  As String
    Dim byte2() As Long
    Dim sum1() As Long
    Dim len1 As Integer, len2 As Integer
    Dim str1 As String
    Dim word As String
    Dim gsmnumber As String
    len1 = Len(instring)
    word = Trim(Mid(instring, 27, len1 - 26)) '取6d4b8b45
    len2 = Len(word)
    ReDim byte1(len2) As String
    For i = 1 To len2
    byte1(i - 1) = Mid(word, i, 1)
    byte1(i - 1) = UCase(byte1(i - 1)) '字母全部转换成大写
    Next i
    '将数组转换成十进制
    ReDim byte2(len2) As Long
    For i = 1 To len2
     Select Case byte1(i - 1)
          Case "A"
            byte2(i - 1) = 10
          Case "B"
            byte2(i - 1) = 11
          Case "C"
            byte2(i - 1) = 12
          Case "D"
            byte2(i - 1) = 13
          Case "E"
            byte2(i - 1) = 14
          Case "F"
            byte2(i - 1) = 15
          Case Else
         byte2(i - 1) = Val(byte1(i - 1))
     
     End Select
     Next i
     '取一个UNCODE码字母的十进制总和,4个数组元素代表一个字
      len1 = Int(len2 / 4) 'len2肯定是4的倍数
      ReDim sum1(len1) As Long
      For i = 1 To len2 Step 4
      
      j = j + 1
      sum1(j - 1) = byte2(i - 1) * 16 * 16 * 16 + byte2(i) * 16 * 16 + byte2(i + 1) * 16 + byte2(i + 2)
      n = sum1(0)
      m = sum1(1)
      
      Next i
      '显示字符串
      
      For i = 1 To len1
      str1 = str1 & ChrW(sum1(i - 1))
      Next i
      '在text里显示出来
      Text1.Text = str1
     
     我运行后text1.text正确显示"测试“两个字
      

  14.   

    上面的n=sum1(0),m=sum1(1)是我调试程序时用的,你可以把它删掉
    我临时编的,可能有些别的小BUG
    但是我运行后是成功的
      

  15.   

    你先告诉我对方发送消息的时候的格式
    对方是直接发unicode码过来的吗
    你直接设置,mscomm.inputmode=comInputModeBinary 
    串口接受的不就是二进制吗还有你下次 回答完问题的时候,
    单击一下下面的“将帖子提前”
    要不我看不到
    可以吗
      

  16.   

    先把串口设置成接收二进制的
    然后
    MSComm1.RThreshold = 1
    设置 Rthreshold 为 1,接收缓冲区收到每一个字符都会使 MSComm 控件产生 OnComm 事件。
    既然你是这样设置的那么
    你收到的“测试"应该是以二进制传输过来的
    那你就设置成buffer=buffer & mscomm1.input
    这样过来的就是二进制字符串了
    现在必须把它转换成16进制
    转换规则就是,每次从这个字符串中选取四位 比如 1101
    换成1个16进制数就可以了
    二进制转换成16进制应该会吧,
    大学一年级就应该会的,呵呵
      

  17.   

    我现在实在不清楚你想知道什么?
    如果传输过来的是二进制,那就没有必要变成16进制
    直接将二进制转变成十进制,在CHR()不就成功了吗
    二进制转换成十进制的算法跟上面我给你的差不多了
    就是用mid函数取四个二进制位,存储在byte(i)里面
    然后
    比如四位二进制位为1101存储在byte(0),byte(1)...转化成10进制
    则total=byte(0)*2*2*2+byte(1)*2*2+byte(2)*2+byte(3)
    这样就变成十进制了,
    接下来,就跟上面一样了,
    你自己认真的总结一下吧
    做程序必须很认真的思考的
      

  18.   

    我现在的想法是将对方发送的信息,转换为16进制进行处理,我的串口设置为
    mscomm1.inputmode=cominputmodebinary
    如果我接受的方式是:buffer=buffer&mscomm1.input,其中buffer应该是设置为变量还是字符串呢,buffer最后是否是“对方发送信息的二进制”呢
    我这里对方发送的格式是固定的,就是帧头+控制字节+信息,帧头是AAH,控制字节是03H,信息是手机号码+短消息内容,其中手机号码是ASC码,短消息内容是UNICODE码,这些都是固定的
    如果buffer最后是接收信息的二进制字符串,那我该怎么转换为16进制的呢,我想转换为16进制来处理,我可以用i=len(buffer)来知道buffer的长度吗?
    我现在都糊涂了,大概是我的基础太差了呀
    谢谢你对我的帮助
      

  19.   

    我试过了,如果mscomm1.inputmode=cominputmodebinary,buffer=buffer & mscomm1.input,我用text1.text=len(buffer),显示为0,这样我无法处理呀
      

  20.   

    妳说,buffer=buffer&mscomm1.input,是接收的二进制的数组吗?我该怎么处理呀,
    谢谢
      

  21.   

    不是数组,是二进制串
    你必须自己转换成数组
    dim byte() as byte
    再用mid取位
      

  22.   

    二进制的串是否意味着buffer=0111011010101010100.....这种形式呀
      

  23.   

    我也取了,可是取不出来呀,我不知道怎么处理这个buffer,让它转换为16进制表示的字符串
    能告诉应该怎么处理呢?
    谢谢
      

  24.   

    这个例子从通讯端口读取 8 个字节的二进制数据,并把它赋给一个字节数组。
    比如传输的是:d6b4659885dded65 十六进制
    Private Sub Command1_Click()
    Dim Buffer as Variant
    Dim Arr() as Byte'设定并打开端口
    MSComm1.CommPort = 1
    MSComm1.PortOpen = True'设定 InputMode 读取二进制数据
    MSComm1.InputMode = comInputModeBinary'等待直到输入缓冲区有 8 个字节
    Do Until MSComm1.InBufferCount < 8
        DoEvents
    Loop'往缓冲区存二进制数据
    Buffer = MSComm1.Input'赋值于字节数组以便处理
    Arr = BufferEnd Sub
    ,Byte 变量存储为单精度型、无符号整型、8 位(1个字节)的数值形式,范围在 0 至 255 之间
    'arr 是数组首地址,现在这里存放着的是二进制字节 
     如果这个时候去用VB 看ARR(0)的值你会发觉 它等于214 这就说明它是十进制的,接下来就是将它们一一还原为十进制,也就是我上面跟你说的十进制转化为16进制的(注意高字节和低字节)。
    下面就跟上面那些一样的步骤了:
    如果还不明白:
    那只好请我来帮你做了,呵呵
      

  25.   

    妳好,我根据妳的提示,重新做的程序,可是我用text1.text显示出来的全是零,妳帮我分析一下,那里有问题,我调试是用两台计算机,用了一个软件叫串口调试助手(如果妳需要,我可以给你)用一根通讯电缆(RS232)连接起来就可以了,我设定对方发送的信息是:aa0331333931303734323331346d4b8bd5,接收没有问题的,因为我用这个软件可以显示出来对方发送过来的信息,妳看我的程序,那里有问题呀
    Private Sub Form_Load()MSComm1.CommPort = 1
    MSComm1.Settings = "9600,N,8,1"
    MSComm1.PortOpen = True
    MSComm1.InputMode = comInputModeBinary
    MSComm1.InBufferCount = 0
    MSComm1.OutBufferCount = 0
    MSComm1.RThreshold = 1
    End Sub
    Private Sub MSComm1_OnComm()
    Select Case MSComm1.CommEvent
    Case comEvRecieveDim sinn() As String, buffer As Variant, instring, gsmnumber, word, inword As String
    Dim i As Long, ii As Long
    Dim byte1() As Long
    Dim sum1() As Long
    Dim byte2() As Byte
    End Select
    If MSComm1.InBufferCount > 0 Thenbuffer = MSComm1.Input
    byte2 = buffer
    ReDim byte2(254)`对方最多可以发送255个字节,这是手机限制了的
    For i = 0 To 254For ii = 1 To 8 Step 4
    word = Mid(byte2(i), ii, 4)
    Select Case word
    Case "0000"
    word = "0"
    Case "0001"
    word = "1"
    Case "0010"
    word = "2"
    Case "0011"
    word = "3"
    Case "0100"
    word = "4"
    Case "0101"
    word = "5"
    Case "0110"
    word = "6"
    Case "0111"
    word = "7"
    Case "1000"
    word = "8"
    Case "1001"
    word = "9"
    Case "1010"
    word = "A"
    Case "1011"
    word = "B"
    Case "1100"
    word = "C"
    Case "1101"
    word = "D"
    Case "1110"
    word = "E"
    Case "1111"
    word = "F"
    End Select
    instring = instring & word
    Next ii
    Next i
    Text1.Text = instring`我运行程序后,这里显示的全是0,为什么呀
    End If
    End Sub
    我的qq是44756788,我已经加妳为好友了,妳不在
    谢谢你的帮忙
      

  26.   

    如果,byte2(0)是个8位的二进制,那我的程序应该是对的呀,我是将它转换为16进制呀,为什么我用text1.text=byte2(0),显示的是零呀
    我真的搞不懂了
    妳帮我解析呀
    谢谢!!!!!!!!!!
      

  27.   

    首先word = Mid(byte2(i), ii, 4)
    这一步就不对
    比如 ,i=0 :
        byte(0)=170   ‘170 是个十进制的数值啊,你怎么能用mid 函数来取呢?  看来你还是不明白我的意思
      你知道170 是怎么得来的吗? 170 = a*10+a (其中a =10)
       你现在必须把170 重新分开来,变回16进制
       再取
      

  28.   

    我还是不明白,我用text1.text=byte2(0),为什么显示为零呀
    byte2()不是个二进制的数组吗?我应该怎么分开这个十进制的数呀
    170 = a*10+a (其中a =10)这句话什么意思呀
      

  29.   

    For i = 0 To 254For ii = 1 To 8 Step 4
    word = Mid(byte2(i), ii, 4)
    你上面的的句子,
    i=0
    word=mid(170 ,ii,4) 这么写当然是什么都取不到了,
    你的text.text当然是怎么都没有了
    在VB里面,byte2(0)它直接认为这是170 ,而不是什么二进制串
    你必须自己把170变回成16进制 就是 “ aa”
    然后再用MID函数
      

  30.   

    我用,hex(byte2(i))是不是可以直接转换为16进制的呀,我不清楚为什么不能在text1.text里显示出byte2(i)的值,只显示为零
      

  31.   

    这是很简单的事啊
    dim str1 as string
    for i= lbound(byte2) to ubound(byte2)
     str1=str1&hex(byte2(i) 
    next i
     '现在str1 就是一个16进制的字符串了,而且就是你刚开始发过来的一样
    现在再用mid 函数,。。
      

  32.   

    你好好看看mid 函数的意思
      

  33.   

    谢谢你了,我们单位要吃饭了,妳也要吃饭了吧,真的很感谢你的帮忙呀
    我去过杭州,在人民玻璃厂,妳知道吗?西湖真的好漂亮呀,真羡慕妳在个好地方呀,我以前一直搞plc,工业控制的,我刚开始学习vb,我下午再好好的想一想,我估计我快弄明白了呀,谢谢你了,有不懂的我会问你的,呵呵,妳这个徒弟很笨呀,呵呵
      

  34.   

    妳好,我又重新做了程序,但是还是不能正常的显示出内容,问题的关键是这里:instring=instring & hex(byte2(i),我用text1.text = instring ,只显示出D5,就是发送信息的最后两位,如果正常的话,应该显示出对方发送的全部信息的16进制呀。如果这里不能正常显示,我以后的程序也不起作用了。我不明白这是为什么呀,下面是我的程序:
    Private Sub Form_Load()MSComm1.CommPort = 1
    MSComm1.Settings = "9600,N,8,1"
    MSComm1.PortOpen = True
    MSComm1.InputMode = comInputModeBinary
    MSComm1.InBufferCount = 0
    MSComm1.OutBufferCount = 0
    MSComm1.RThreshold = 1
    End Sub
    Private Sub MSComm1_OnComm()Dim sinn() As String, buffer As Variant, instring, gsmnumber, word, inword As String, start, pausetime As Variant
    Dim i, ii As Long
    Dim byte1() As String
    Dim sum1(), byte3() As Long
    Dim byte2() As Byte
    Dim len1, len2 As IntegerSelect Case MSComm1.CommEvent
    Case comEvRecieve
    end select
    buffer = MSComm1.Input
    byte2 = bufferFor i = LBound(byte2) To UBound(byte2)
    instring = instring & Hex(byte2(i))
    Next i
    Text1.Text = instring   `这里不能显示出全部的信息,为什么呀
    x = Len(Trim(instring))
    gsmnumber = Trim(Mid(instring, 5, 22))
    word = Trim(Mid(instring, 23, x))
    len2 = Len(word)
    ReDim byte1(len2)
    For ii = 1 To len2
    byte1(ii - 1) = Mid(word, ii, 1)
    byte1(ii - 1) = UCase(byte1(ii - 1))
    Next ii
    ReDim byte3(len2) As Long
    For ii = 1 To len2
    Select Case byte1(ii - 1)
    Case "A"
    byte3(ii - 1) = 10
    Case "B"
    byte3(ii - 1) = 11
    Case "C"
    byte3(ii - 1) = 12
    Case "D"
    byte3(ii - 1) = 13
    Case "E"
    byte3(ii - 1) = 14
    Case "F"
    byte3(ii - 1) = 15
    Case Else
    byte3(ii - 1) = Val(byte1(ii - 1))
    End Select
    Next ii
    len1 = Int(len2 / 4)
    ReDim sum1(len1)
    For ii = 1 To len2 Step 4
    j = j + 1
    sum1(j - 1) = byte3(ii - 1) * 16 * 16 * 16 + byte3(i) * 16 * 16 + byte3(ii + 1) * 16 + byte3(ii + 2)
    Next iiFor ii = i To len1
    inword = inword & ChrW(sum1(ii - 1))
    Next iiIf Timer > start + pausetime Then
    MSComm1.InBufferCount = 0
    End IfEnd Sub
      

  35.   

    我觉的错误应该是出在byte2 = buffer
    这个语句上面
    我想在这里应该也得用一个循环,
    来将buffer里面的串,存储在byte2数组里面
    你应该会VB的逐行调试吧
    你试着调试一下上面那些语句
    然后把一些值告诉我,或者,你自己就可以找出毛病所在了我今天不在状态,跟我一起来这个烂公司的的一个兄弟辞职走了,心里波动比较大,所以没有什么心情来编程序,你自己好好测试一下吧
    我不在杭州,要是杭州我也喜欢,我在温州,烂地方一个。
      

  36.   

    妳好,我理解妳的心情,但是我觉得最重要的是要提高自己的能力和水平,妳刚毕业,不要太计较报酬了,这是我的观点呀
    对了,逐行调试,是按F8吗?我调试的时候,直接就跳过on_comm了,我也不知道怎么了,妳说那个循环该怎么做呀,可以提示我吗?
      

  37.   

    我调试了,我告诉你一个现象,有时候text1.text会将信息完全显示出来,但是,大多数情况是显示的最后两位,这是为什么呀
      

  38.   

    要测试oncomm 事件,必须这么测试
    你先在oncomm事件头,设置一个断点
    然后你全部运行程序,也就是按F5,
    接下来,你在你的另外一台机子把数据
    传输过来,这样,程序就会自动在 oncomm
    事件上停止下来,然后你就可以按F8了呵呵,事先申明,我可是凭感觉说的,能不能实现,我就不知道了
    相信你自己了,你肯定能够遍出来它的
    我现在已经不做这个系统了
    我们老板,拿不到固话短消息的协议,所以,我只能停工了
    现在必须做另外一个系统,是一个话务台软件,而且是用C++BUILDer做的
    所以,以后,我可能不怎么会来这个VB论坛了,
    大部分会在CB论坛上,如果以后还能再帮你点什么忙的的话,可以给我发短消息,在这里。