loveminyi 2024-05-02 19:17 采纳率: 0%
浏览 6

VFP中使用winsock控件发二进制数据不成功!!

VFP中使用winsock控件收发网络数据时,如果包含有二进制数据,总是会丢失,或者与实际数据不符,这是由于字符转换的问题引起的。
vfp的字符串本质与二进制数据没有任何区别,而所有的OCX控件和COM组件(OCX控件本质是一种有界面的COM),默认都是UNICODE字符传输,虽然COM定义了几十种数据类型,但在VFP中,基本就只数字和字符可以用了,所以VFP在与组件交换数据时,会自动进行ansi->unicode或者unicode->ansi转换,大于128的字符如果成对则不易转错,但不成对出现时,这种转换就失败了,导致数据不是原始的数据,为了避免VFP的自动转换,可按如下方式处理:

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

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

                        版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
                    

原文链接:https://blog.csdn.net/ljyit/article/details/124764390
按以上博主的方法发送数据,服务器收的跟发送的不相同,指点指点!

img

  • 写回答

5条回答 默认 最新

  • 码农阿豪@新空间代码工作室 Java领域优质创作者 2024-05-02 19:19
    关注
    让阿豪来帮你解答,本回答参考chatgpt3.5编写提供,如果还有疑问可以评论或留言
    根据问题描述,初步判断是数据传输过程中出现了字符转换问题,导致二进制数据丢失或与实际数据不符。为了解决这个问题,可以按照博主提供的方法,在VFP传输数据给组件时,使用CreateBinary()函数将字符串直接转换成二进制数据,避免VFP自动进行字符转换。但是该方法在实际使用中出现了问题,导致服务器收到的数据与发送的不相同。为了解决这个问题,我们可以考虑以下几点:
    1. 确认服务器和客户端之间的传输协议和编码格式是否一致。如果服务器和客户端之间使用的编码格式不一致,就会导致数据传输过程中出现乱码或转换错误。
    2. 检查二进制数据是否正确传输。可以通过Wireshark等网络抓包工具,观察数据包中的二进制数据是否正确传输,是否有丢失或替换。
    3. 确认数据发送的方式是否正确。除了使用CreateBinary()函数外,还可以使用其他方法将字符串转换成二进制数据,并发送给服务器。比如可以使用ASC()函数将字符串转换成ASCII码,再将ASCII码依次存储到一个BYTE数组中,最后发送该BYTE数组给服务器。 下面是一个简单的案例,演示如何使用ASC()函数将字符串转换成BYTE数组,并发送给服务器:
    * 创建Winsock控件
    tmpsock = CREATEOBJECT("MSWinsock.Winsock")
    * 连接服务器
    tmpsock.RemoteHost = "127.0.0.1"
    tmpsock.RemotePort = 80
    tmpsock.Connect()
    * 发送数据
    tmpstr = "hello world"
    tmpdata = CAST(CreateArray(REPLICATE(0,LEN(tmpstr))) AS "BYTE")
    FOR i = 1 TO LEN(tmpstr)
        tmpdata[i] = ASC(SUBSTR(tmpstr,i,1))
    ENDFOR
    tmpsock.SendData(tmpdata)
    * 关闭连接
    tmpsock.Close()
    

    在上面的代码中,我们使用ASC()函数将字符串转换成ASCII码,依次存储到一个BYTE数组中,最后将BYTE数组发送给服务器。这样做可以避免VFP自动进行字符转换,确保数据传输的准确性。当然,具体的实现方式还需要根据实际情况而定。

    评论

报告相同问题?

问题事件

  • 创建了问题 5月2日

悬赏问题

  • ¥15 求达梦8数据库安装包
  • ¥15 YOLOv8模型网络结构更改后报错
  • ¥15 深度学习中梯度为None
  • ¥15 zynq烧写程序到flash后不运行
  • ¥15 (标签-51单片机|关键词-#include)
  • ¥15 裸板ESD问题的思考与实验
  • ¥15 electron+python
  • ¥50 远程调试PLC的解决方案的问题
  • ¥15 微信收付通中,自动分账的情况下,某一接收方分账失败了系统会自动在发起重新分账吗
  • ¥15 宝塔ssl证书一直待待验证