我想发送如下的字节数组例如:
dim a(5) as byte
a(0)=74
a(1)=90
a(2)=113
a(3)=0 
a(4)=0 
a(5)=235
我想用winsock控件把他发出去,但是我要加一个头"@",还有一个尾"|"
所以我这样做的:
先定义s=a  '把a转换为字符串
然后sss1="@" + s + "|"
最后winsock1.SendData sss
可是我另一边winsock接收时候用winsock2.GetData pdata, vbString
取过来的数据分离出头"@"和尾"|"之后得到的字符串sss2,直接再转换为字节数组:
dim a2() as byte
as=sss2
a2()却跟原来的a()不一样了
(在前面发送时使用过strconv函数转换,之后接收时再反转换也是不正确)
请问,我到底该怎么发送才能接受正确呢,非常感谢

解决方案 »

  1.   

    关键在于“winsock2.GetData pdata, vbString”
    此时WinSock控件会自动调用strconv函数转换,破坏二进制数据直接用二进制协议算了
    先发送4字节长度值,再发送数据
      

  2.   

    中文系统惹的祸。大于 167 的值会被当作中文字符的首字节来处理。如果这样的字符不存在,它会自动转成“?”。所以在中文系统下传送二进制值不要使用字符串,直接使用 byte 数组。dim a(7) as byte
    a(1)=74
    a(2)=90
    a(3)=113
    a(4)=0 
    a(5)=0 
    a(6)=235a(0) = Asc("@")
    a(7) = Asc("|")winsock1.SendData a接收时候用winsock2.GetData b, vbByte, 8
      

  3.   

    dim NewS(7) as byte
    NewS(0)= asc("@")
    NewS(7)= asc("|")
    for i = 0 to 5
      NewS(i+1) = a(i)
    next
    winsock1.SendData News接收的时候就使用2进只接收就可以了!!和你上面的代码也麻烦不了很多,不是吗?
      

  4.   

    在安全性能要求高的环境下,一般都把二进制数据转换成字符串格式进行方式,比如Http和SMTP协议,不过它们的编码方式都比较复杂,一种比较简单的编码方式如下:Public Function Decoder(ByVal data As String) As Byte()
        
        Dim intLength As Integer
        Dim intArraySize As Integer
        Dim bytRet() As Byte                                            '定义字节数组
        
        intLength = Len(data)
                    
        If (intLength Mod 2) = 0 Then                                '如果输入的字符串长度是偶数
            intArraySize = intLength \ 2                             '直接以长度的一半作为数组大小
        Else                                                         '为奇数
            strTempData = "0" & strTempData                          '补零变成偶数
            intArraySize = Len(strTempData) \ 2
        End If
        
        ReDim bytRet(0 To intArraySize - 1) As Byte                                '重定义字节数组    For i = 0 To intArraySize - 1
         
           bytRet(i) = CInt("&H" & Mid(data, 2 * i + 1, 2))                  '将得到的十六进制格式转换字节数组
            
        Next
        
        Decoder = bytRet
        
    End Function
    Public Function Coder(data() As Byte) As String    Dim strRet As String
        Dim strTemp As String
        Dim i As Integer
        
        On Error GoTo Errhander:
        
        For i = LBound(data) To UBound(data)
        
            strTemp = Hex(data(i))
            
            '补齐字符
            If Len(strTemp) = 1 Then strTemp = "0" & strTemp
            
            strRet = strRet & strTemp
        Next
        Coder = strRet
        Exit Function
    Errhander:
        Coder = ""
    End Function
      

  5.   

    与安全性没有什么关系。在互联网中将数据转换成小于 127 的字符来传送的原因是,在某些网络通讯协议中,数据位只有 7 个 bit。楼主的应用完全没有必要脱了裤子放屁。
      

  6.   

    我就是想实现多条的、长度不一样的字节数组数据的winsock发送,并且在接收端也能正确分条
    解析出来,
    要用什么方法,不一定上面的方法,换个思路也行,只要解决问题就可以,谢谢,再加分50也可以
      

  7.   

    //  我就是想实现多条的、长度不一样的字节数组数据的winsock发送,并且在接收端也能正确分条解析出来,
    直接用二进制协议算了
    先发送4字节长度值,再发送数据
      

  8.   

    编号:73716 发送者:riwan61170 发送时间:2006-2-16 9:40:47 删除  回复 
    接受者:zyl910 重要性:重要性:1 非常不重要重要性:2 不重要重要性:3 一般重要性:4 重要重要性:5 非常重要 
    内容 //直接用二进制协议算了
    先发送4字节长度值,再发送数据这样的话,我必须分开发送,就不能批量发送了啊,用字符串可以标识出开始和结尾,用这个来判别结束从而分开条数,这样的思路没法解决是吗,非常感谢你的回复。
    因为我现在是做的程序,需要发送一组预先不知道长度的16进制的数组,然后还要附加上发送这个十六进制数的设备号(例2314,为整型),所以我才想到要以字符串形式发送出去,大哥,帮帮我,我太弱了 ===============================================用Byte数组当缓冲区
    发送时将长度、数据在缓冲区内合并好了再发送
    接收时先将数据放在缓冲区中,先读取长度值,再分析数据具体代码可参考《数据结构》中的关于串的算法
    串算法就是专门处理这一类问题的
    注意串并不是单指字符串,凡是有共同点多个数据都能称为串(现在更流行用流这个词)用字符协议有很大的缺点的:你不能肯定发送的数据中会不会出现控制字符
    所以以前网络协议数据都用7位ASCII码,高128作控制字符