| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
共有 1142 人关注过本帖
标题:htons()返回不同值的问题
取消只看楼主 加入收藏
sam_jiang
Rank: 10Rank: 10Rank: 10
等 级:贵宾
威 望:14
帖 子:1055
专家分:1622
注 册:2021-10-13
结帖率:97.75%
收藏
已结贴  问题点数:20 回复次数:6 
htons()返回不同值的问题
同一个winapi函数htons,为什么会返回不同的值?
导致我用bintoc函数时报错,bintoc的第一个参数的值范围–32,768 到 32,767,这个值为正时恰巧超出了!
这个问题要怎么解决呢?

附上图片:
图片附件: 游客没有浏览图片的权限,请 登录注册
搜索更多相关主题的帖子: 超出 返回 不同 函数 图片 
2025-09-29 22:20
sam_jiang
Rank: 10Rank: 10Rank: 10
等 级:贵宾
威 望:14
帖 子:1055
专家分:1622
注 册:2021-10-13
收藏
得分:0 
简单粗暴地用一句代码可以让它符合bintoc的要求iif(htons(8080)>32767,htons(8080)-0xffff,htons(8080))但是依然没能解释为什么htons()函数会返回2个不同的值?是vfp的问题?还是winapi的问题?还是我的问题

[此贴子已经被作者于2025-9-30 12:09编辑过]

2025-09-30 12:07
sam_jiang
Rank: 10Rank: 10Rank: 10
等 级:贵宾
威 望:14
帖 子:1055
专家分:1622
注 册:2021-10-13
收藏
得分:0 
国庆中秋节快乐!

问了deepseek,它给出了如下答复:

在 Visual FoxPro (VFP) 中,HTONS(8080) 返回不同结果(如 ‌36895‌ 和 ‌-28641‌)的原因与 ‌有符号整数‌ 和 ‌无符号整数‌ 的存储方式有关。以下是具体解释:

1. 根本原因‌
HTONS() 函数将 ‌16 位整数‌ 从主机字节序(Host)转换为网络字节序(Network)。
8080‌ 的二进制表示:00011111 00010000(大端序)。
转换后:
无符号整数‌:36895(直接解析为 10001111 11011111)。
有符号整数‌:-28641(最高位为 1 时表示负数,补码解析)。
2. 为什么结果不同?‌
VFP 的数值存储机制‌:
VFP 默认以 ‌有符号整数‌ 处理数值,但某些情况下(如内存直接读取)会按 ‌无符号整数‌ 解析。
当数值超过 ‌32,767‌(16 位有符号整数最大值)时,VFP 可能将其解释为负数(补码形式)。
示例计算‌:
36895(无符号)的二进制:10001111 11011111。
转换为有符号补码:-28641(因为最高位 1 表示负数)。
2025-10-01 19:04
sam_jiang
Rank: 10Rank: 10Rank: 10
等 级:贵宾
威 望:14
帖 子:1055
专家分:1622
注 册:2021-10-13
收藏
得分:0 
回复 11楼 吹水佬
检查了我的源代码,确实是我申明错了,厉害!

我确实申明为integer了,应该是short!@sych @吹水佬,感谢2位
2025-10-02 18:58
sam_jiang
Rank: 10Rank: 10Rank: 10
等 级:贵宾
威 望:14
帖 子:1055
专家分:1622
注 册:2021-10-13
收藏
得分:0 
回复 13楼 sych
感谢,感谢,的确是这个问题导致!

程序代码:
...
    PROTECTED PROCEDURE dodecl
        DECLARE INTEGER WSAStartup IN ws2_32 INTEGER wVersion, STRING @lpWSAData
        DECLARE INTEGER WSACleanup IN ws2_32
        DECLARE INTEGER listen IN ws2_32 INTEGER s, INTEGER backlog
        DECLARE INTEGER accept IN ws2_32 INTEGER s, STRING @addr, INTEGER @addrlen
        DECLARE INTEGER socket IN ws2_32 INTEGER af, INTEGER type, INTEGER protocol       
        DECLARE INTEGER bind IN ws2_32 as _bind INTEGER s, STRING @sockaddr, INTEGER namelen
        DECLARE INTEGER send IN ws2_32 INTEGER s, STRING buf, INTEGER len, INTEGER flags       
        DECLARE INTEGER sendto IN ws2_32;
            INTEGER s, STRING buf, INTEGER len, INTEGER flags,;
            STRING @to, INTEGER tolen       
        DECLARE INTEGER accept IN ws2_32 INTEGER s, STRING @addr, INTEGER @addrlen
        DECLARE INTEGER recvfrom IN ws2_32;
            INTEGER s, STRING @buf, INTEGER len, INTEGER flags,;
            STRING @from, INTEGER @fromlen
        DECLARE INTEGER connect IN ws2_32 INTEGER s, STRING @name, INTEGER namelen                      
        DECLARE INTEGER recv IN ws2_32 INTEGER s, STRING @buf, INTEGER len, INTEGER flags        
        DECLARE STRING inet_ntoa IN ws2_32 INTEGER in
        DECLARE INTEGER inet_addr IN ws2_32 STRING @cp
        DECLARE INTEGER ntohs IN ws2_32 INTEGER netshort
        DECLARE INTEGER htons IN ws2_32 INTEGER netshort
        DECLARE INTEGER WSACleanup IN ws2_32
        DECLARE INTEGER closesocket IN ws2_32 INTEGER s
...
2025-10-02 18:59
sam_jiang
Rank: 10Rank: 10Rank: 10
等 级:贵宾
威 望:14
帖 子:1055
专家分:1622
注 册:2021-10-13
收藏
得分:0 
回复 19楼 sych
你这样不行
2025-10-08 09:26
sam_jiang
Rank: 10Rank: 10Rank: 10
等 级:贵宾
威 望:14
帖 子:1055
专家分:1622
注 册:2021-10-13
收藏
得分:0 
回复 25楼 sych
你这段代码htons函数声明不对,和我一样申明为long或integer了!
2025-10-08 17:14
快速回复:htons()返回不同值的问题
数据加载中...
 
   



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

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.019774 second(s), 12 queries.
Copyright©2004-2025, BC-CN.NET, All Rights Reserved