注册 登录
编程论坛 VFP论坛

用VFP9通过WINSOCK接收设备发来的数据不正确

ljy88888 发布于 2022-04-22 11:13, 2237 次点击
我用VFP9通过WINSOCK接收设备发来的数据不正确
本来应该收到:10 02 00 00 00 00 00 00 00 00 ff 00 04 00 29 a9 10 03 ,而收到的是:10 02 00 00 00 00 00 00 00 00 FF 00 04 00 29 3F 03 ,其中 a9 10为什么变为3F了?

好像ASC码小的都正常,ASC码大的成对出现也正常(如:FF),不成对的(如:A9)就不正常了。

求高手指点
14 回复
#2
吹水佬2022-04-22 19:13
UTF-8
#3
厨师王德榜2022-04-22 20:20
回复 2楼 吹水佬
靠谱!
#4
ljy888882022-04-23 10:40
回复 2楼 吹水佬
请吹总明示 ,UTF-8要怎么做,关键是接收时少了一个字节
#5
sych2022-04-23 11:18
把你的代码贴出来,这样大家才能帮你找问题
#6
ljy888882022-04-23 12:43
回复 5楼 sych
只有本站会员才能查看附件,请 登录


参数传进来是9个字节,用GETDATA(),后,就只有8个字节了。在第13个和14个字符如果数字或字母成对的如15,36,AB之类的,取的数据还是9个字节,如果不成对如A1,1D,则接收的是8个字节

只有本站会员才能查看附件,请 登录


#7
sych2022-04-23 17:44
1 cData=SPACE (bytestotal)
加大一点
#8
ljy888882022-04-23 17:58
回复 7楼 sych
加大没用的,可能是VFP在与控件传递数据时对收到的数据内部自动做了代码页转换造成的。
#9
sych2022-04-23 18:35
你的问题描述不清楚,你还是把你的代码完整贴出来,否则一切都靠猜,问题能够重现才能对症下药
#10
sych2022-04-25 16:43
https://www.
你用这个工具,连接你的设备试试,找找问题出在哪里
#11
sostemp2022-04-26 11:46
sokit
#12
吹水佬2022-04-26 19:34
以下是引用ljy88888在2022-4-23 10:40:33的发言:

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

看似是两个不同编码的字符串,这就有可能不相等的情况。
如ASC的 0hA910 的UTF-8是 0h3F
#13
sych2022-04-27 15:00
用上面的工具模拟服务端或客户端,查看接收的数据,然后查找问题
#14
my23182022-04-28 07:06
一般看两端是否采用了不同的编码,另外考虑数据长度不要超出允许值
#15
亮亮贝2023-10-31 20:01
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.
1