| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 908 人关注过本帖
标题:[转载]winsock 接收二进制数组后组合的问题
取消只看楼主 加入收藏
学习VB才2天
Rank: 5Rank: 5
等 级:贵宾
威 望:16
帖 子:1653
专家分:0
注 册:2006-5-4
收藏
 问题点数:0 回复次数:0 
[转载]winsock 接收二进制数组后组合的问题

dim abfile() as byte

Private Sub wskclient_DataArrival(ByVal bytesTotal As Long) '客户端一收到数据
Dim wskclientstrs() As Byte
??????
End Sub

客户端收到的二进制数据,会被累加保存到abfile中,试过用

wskclient.GetData wskclientstrs
abfile = abfile &(或+) & wskclientstrs

但提示为出错.(如将ABFILE写入以二进制写入一个临时的文件,则没问题,但考虑到加密安全,只想让ABFILE保存到内存中.
希望达到效果:
接收到数据前abfile="",接收数据时abfile=abfile&收到的数据,接收完全数据时提示msgbox "ok"

看看ReDim语句和CopyMemory API函数。
如果是字符传可以直接连起来!如果是integer的话,就需要还原后再使用
要不以后不方便
Private Sub wskclient_DataArrival(ByVal bytesTotal As Long) '客户端一收到数据
Dim i As Long
Dim j As Long
Dim dummy() As Byte
ReDim buff(bytesTotal) As Byte
wskclient.GetData buff, vbbytes, bytesTotal
ReDim dummy(lAlreadyTran) As Byte

For j = 1 To lAlreadyTran
dummy(j) = PicBits(j)
Next
ReDim PicBits(lAlreadyTran + bytesTotal)
'MsgBox (PicBits)
For j = 1 To lAlreadyTran
'MsgBox dummy(j)
PicBits(j) = dummy(j)
Next
ReDim dummy(0) As Byte
For i = 1 To bytesTotal
PicBits(lAlreadyTran + i) = buff(i - 1)
Next

lAlreadyTran = lAlreadyTran + bytesTotal

实现了.所有数据存储在全局变量PicBits中.不过最开头的地方会多个0字节,再用一次REDIM去掉即可.

或者用这段.更简单点.
Dim i As Long
Dim j As Long
Dim dummy() As Byte
ReDim buff(bytesTotal) As Byte
wskclient.GetData buff, vbbytes, bytesTotal
ReDim dummy(lAlreadyTran) As Byte
If et = "" Then
PicBits = buff
et = "ok"
Else
ReDim Preserve PicBits(UBound(PicBits) + bytesTotal)
For i = 0 To bytesTotal - 1
PicBits(i + lAlreadyTran) = buff(i)
Next

End If
lAlreadyTran = lAlreadyTran + bytesTotal

所以说数组哪能用&来做连接的呢。用COPYMEMORY的话,你的循环也可以省了。

嘻.不用会.迟些查下API手册先.
原理上来说COPYMEMORY会比循环节省很多资源.

呵呵,我不觉得放在内存中是件好事,我以前也有做过一个C/S的网络通讯程序,本来想直接放在内存中,等接收完后再组合成文件放到硬盘上,发送小文件还可以,大文件呢,有1-N G的文件,你有G级以上的内存吗???把内存作为中转站吧,这样做更适合,我是这样觉得。


在此想请教高手们,为什么我发送文件过去,有的EXE文件可以用有的不能用,但其它类型的就是能用,真是郁闷,如我发送一个安装程序,等接收完的时候,安装程序进度条走了一会儿,就告诉我安装包有错误???

接收组合数据数组的时候出错了.
如果你接收的数据不需要存到内存上的话,就直接边收边把数据保存到硬盘上,这样就不会出错了.连上面的那些接收组合的代码都省了.呵,我是想数据安全,才放到内存中,毕竟硬盘上的东西,一搜索就出来了,偷硬盘的数据比偷内存的数据简单多了.
试试这个:

abfile =constrv(constrv(abfile,vbunicode) & constrv(wskclientstrs,vbunicode),vbfromunicode)

二进制数据一般不能用strconv,因为进行unicode与ANSI的转换,会改变Byte数组中的数据!

其实VB是可以直接连接Byte数组的,可用下面方法:

abfile = CStr(abfile) & CStr(wskclientstrs)

至于这种方法的效率吗,可测试看看,绝不算慢!

搜索更多相关主题的帖子: winsock 二进制 
2006-12-12 14:54
快速回复:[转载]winsock 接收二进制数组后组合的问题
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.019851 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved