用WINSOCK做了传输文件的程序,在接受文件时,出现了乱码(部分汉字乱码),
   例如我要传输的内容,传输出去后,接收到是这样的:Dim Gvstr As String = "" '全局变量 历史遗留数砭莅?
请各位大侠告诉我该如何接收才能保证不乱码呢?

解决方案 »

  1.   

    是字符编码的问题,可以使用StrConv转换一下。可否把代码贴上来看看?
      

  2.   

    本帖最后由 bcrun 于 2012-02-29 21:18:59 编辑
      

  3.   


    Option ExplicitPrivate Sub Command1_Click()
        Dim f As Integer
        Dim bytData(0 To 1) As Byte
        Dim strP As String
        
        '一个汉字占用两个字节,我这里举一个例子,假使你接收的数组只有两个字节
        bytData(0) = &HBA   'UniCode字符:汉   的低字节
        bytData(1) = &HBA   'UniCode字符:汉   的高字节
        strP = StrConv(bytData, vbUnicode)  '转换为UniCode
        f = FreeFile
        Open "C:\1.txt" For Binary As #f '保存文件
        Put #f, 1, strP
    End Sub
    执行了本代码后,你到C盘打开1.txt看看,里面有没有一个“汉”字,如果有就写成功了。
      

  4.   

    本帖最后由 bcrun 于 2012-02-29 21:13:10 编辑
      

  5.   

    不知道有多少前人掉在TCP Socket
    send(人多)send(病少)send(财富)
    recv(人多病)recv(少财富)
    陷阱里面啊!
      

  6.   

    发现问题了,发送的内容如果是:“数据”这两个字,对应的二进制代码应该是:CA FD BE DD。
    但我用DataArrival事件却接收到了5个字节:CA FD ED BE DD。
    如果发送“数”这一个字,收到了3个字节:CA FD ED。也就是说ED这个字节是不正确的。应该是CA FD 。
    请问这个现象是怎么回事呢??大家给点儿意见啊!
      

  7.   

    发送和接受的步调不一致?
    那你就在接受时间中处理一下?添加一个延迟?Sleep 10之类的?
      

  8.   

    呵呵,问题解决了。原因是我的无线传输模块的问题。配置改变了下,就好了。谢谢大家的指点!
    再追加一个问题,我现在传输TXT文件没有问题,我个人觉得传输什么格式的文件应该都没有区别吧,但我传输WORD文档就出错了。这是为什么呢
      

  9.   

    成功了,原因是我的无线传输模块的配置有问题了。谢谢大家的意见!
    顺便追问一个问题:我现在传输TXT文件没有问题了,但传输WORD文件却不行,感觉应该跟程序没有关系吧
      

  10.   

    将任何要传输的内容都转为Byte数组,发送,接收Byte数组,反转为所需内容。
      

  11.   


    Dim lngFileSize As Long
    Dim lngReadSize As Long
    Dim strFileName As String
    Dim lngState As Long
    Dim fs As Integer
    Private Sub Command1_Click()
        strFileName = "C:\test.rar"
        lngFileSize = 0
        lngReadSize = 0
        lngState = 0
        Winsock1.Connect "127.0.0.1", 999
    End SubPrivate Sub Winsock1_Connect()
        Winsock1.SendData "GET " & strFileName
    End SubPrivate Sub Winsock1_DataArrival(ByVal bytesTotal As Long)
        Dim byBuff() As Byte
        Dim strBuff As String
        Select Case lngState
        Case 0: ' 取得服务器发回来的文件数据大小
                Winsock1.GetData strBuff, vbString, bytesTotal
                If Len(strBuff) < 5 Then
                    Winsock1.Close
                    Exit Sub
                End If
                If UCase(Left(strBuff, 3)) <> "+OK" Then
                    Winsock1.Close
                    Exit Sub
                End If
                strBuff = Right(strBuff, Len(strBuff) - 4)
                If IsNumeric(strBuff) = False Then
                    Winsock1.Close
                    Exit Sub
                End If
                lngFileSize = CLng(strBuff)
                lngState = 1
                Winsock1.SendData "+OK Send Data"
                Exit Sub    Case 1: '开始读取文件数据
                Winsock1.GetData byBuff, vbArray + vbByte, bytesTotal
                If lngReadSize = 0 Then
                    fs = FreeFile
                    Open strFileName For Binary As #fs
                End If
                Put #fs, , byBuff
                lngReadSize = lngReadSize + bytesTotal
                If lngReadSize >= lngFileSize Then
                    Close #fs
                    Winsock1.Close
                End If
                Exit Sub
        End Select
    End Sub
      

  12.   

    1. winsock 可以有两种数据传输,字符串和二进制字节数组,其中二进制字节数组传输最快2. 使用getdata和peekdata可以接收数据,peekdata接收效果最好,适合大文件,稳定可靠,只能用TCP协议, 只是接收之后不清楚缓冲区,需要再次调用getdata3. 在发送接收过程中分包,分包造成汉字分成2部分,造成乱码。所以全部用字节数组接收,接收全部完成之后,再转换就OK了。