| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1898 人关注过本帖
标题:用VFP9通过WINSOCK接收设备发来的数据不正确
只看楼主 加入收藏
sostemp
Rank: 4
等 级:贵宾
威 望:10
帖 子:202
专家分:284
注 册:2009-6-2
收藏
得分:2 
sokit
2022-04-26 11:46
吹水佬
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:451
帖 子:10608
专家分:43190
注 册:2014-5-20
收藏
得分:0 
以下是引用ljy88888在2022-4-23 10:40:33的发言:

请吹总明示 ,UTF-8要怎么做,关键是接收时少了一个字节

看似是两个不同编码的字符串,这就有可能不相等的情况。
如ASC的 0hA910 的UTF-8是 0h3F
2022-04-26 19:34
sych
Rank: 6Rank: 6
等 级:侠之大者
威 望:7
帖 子:317
专家分:448
注 册:2019-10-11
收藏
得分:0 
用上面的工具模拟服务端或客户端,查看接收的数据,然后查找问题
2022-04-27 15:00
my2318
Rank: 7Rank: 7Rank: 7
等 级:贵宾
威 望:14
帖 子:258
专家分:640
注 册:2014-3-18
收藏
得分:2 
一般看两端是否采用了不同的编码,另外考虑数据长度不要超出允许值
2022-04-28 07:06
亮亮贝
Rank: 1
等 级:新手上路
帖 子:13
专家分:0
注 册:2017-2-1
收藏
得分:0 
VFP中使用winsock控件收发网络数据时,如果包含有二进制数据,总是会丢失,或者与实际数据不符,这是由于字符转换的问题引起的。
vfp的字符串本质与二进制数据没有任何区别,而所有的OCX控件和COM组件(OCX控件本质是一种有界面的COM),默认都是UNICODE字符传输,虽然COM定义了几十种数据类型,但在VFP中,基本就只数字和字符可以用了,所以VFP在与组件交换数据时,会自动进行ansi->unicode或者unicode->ansi转换,大于128的字符如果成对则不易转错,但不成对出现时,这种转换就失败了,导致数据不是原始的数据,为了避免VFP的自动转换,可按如下方式处理:

1.从VFP传给组件
只需要简单套个CreateBinary(),VFP在把字符串传给组件时,不做任何转换,相当于BYTE或者LPBYTE,比如在winsock中发送二进制数据时,可以这样:

this.SendData(CreateBinary(你的字符串))

2.从组件到VFP

这种情况比较复杂,可以使用的数组做为COM字节数组传递,比如在winsock中接收二进制数据,需要按如下方式处理:

DataArrival事件中:

LPARAMETERS bytestotal

ComArray(this.object,11)
Dimension lcBuffer[1] as Byte
this.object.GetData(@lcBuffer,17,bytesTotal)

?lcBuffer
?Strconv(lcBuffer,15)

这样获取到的数据就是原始的二进进制数据,不会被VFP转换。
在使用其他ocx控件或者com组件时,如果遇到需要处理二进制数据,均可按此方法,稍加修改即可。
————————————————
版权声明:本文为CSDN博主「ljyit」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.
2023-10-31 20:01
快速回复:用VFP9通过WINSOCK接收设备发来的数据不正确
数据加载中...
 
   



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

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