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

附上图片:
图片附件: 游客没有浏览图片的权限,请 登录注册
搜索更多相关主题的帖子: 超出 返回 不同 函数 图片 
3 天前 22:20
吹水佬
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:451
帖 子:10747
专家分:43325
注 册:2014-5-20
收藏
得分:0 
试试先按数值的位数判断有无符号位
如:
8位数0x7F无符号位(BITAND(0x7F,0x80)!=0x80)
8位数0x81有符号位(BITAND(0x81,0x80)==0x80)
如果无符号位取原数值 0x7F
如果有符号位取 0x81 - (2^8)
前天 00:14
吹水佬
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:451
帖 子:10747
专家分:43325
注 册:2014-5-20
收藏
得分:0 
写个转换函数,测试一下
程序代码:
? UnsignedToSigned(32767,16)
? UnsignedToSigned(32768,16)

** 无符号整数转有符号整数,nBitSize:81632
FUNCTION UnsignedToSigned(nValue, nBitSize)
    IF !INLIST(nBitSize, 8,16,32)
        ERROR "无效的位数"
        RETURN nValue
    ENDIF
    LOCAL nMask, nSignBit
    nMask    = IIF(nBitSize==8,0xFF, IIF(nBitSize==16,0xFFFF, IIF(nBitSize==32,0xFFFFFFFF, 0)))
    nSignBit = IIF(nBitSize==8,0x80, IIF(nBitSize==16,0x8000, IIF(nBitSize==32,0x80000000, 0)))
    IF !BETWEEN(nValue, 0,nMask)
        ERROR TRANSFORM(nValue)+"超出"+TRANSFORM(nBitSize)+"位无符号整数范围"
        RETURN nValue
    ENDIF
    nValue = BITAND(nValue, nMask)            && 保留nBitSize位数值
    IF BITAND(nValue, nSignBit) == nSignBit   && 掩码检查符号位
        RETURN nValue - (2^nBitSize)          && 有符号
    ENDIF 
    RETURN nValue
ENDFUNC
前天 07:50
schtg
Rank: 13Rank: 13Rank: 13Rank: 13
来 自:Usa
等 级:贵宾
威 望:67
帖 子:2240
专家分:4717
注 册:2012-2-29
收藏
得分:0 
前天 09:32
sam_jiang
Rank: 10Rank: 10Rank: 10
等 级:贵宾
威 望:14
帖 子:974
专家分:1516
注 册:2021-10-13
收藏
得分:0 
简单粗暴地用一句代码可以让它符合bintoc的要求iif(htons(8080)>32767,htons(8080)-0xffff,htons(8080))但是依然没能解释为什么htons()函数会返回2个不同的值?是vfp的问题?还是winapi的问题?还是我的问题

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

前天 12:07
吹水佬
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:451
帖 子:10747
专家分:43325
注 册:2014-5-20
收藏
得分:0 
以下是引用sam_jiang在2025-9-30 12:07:19的发言:

简单粗暴地用一句代码可以让它符合bintoc的要求iif(htons(8080)>32767,htons(8080)-0xffff,htons(8080))但是依然没能解释为什么htons()函数会返回2个不同的值?是vfp的问题?还是winapi的问题?还是我的问题

可能是vfp数值类型定义的问题。
虽然vfp是用C写的软件,但vfp按位运算是没有“有符号整数”和“无符号整数”的概念,好像都定义为有符号整数。
vfp是32位编译软件,但vfp的数值类型数据是可以超出32位数值的范围。
bintoc()是按字节参数转换,即按位计算,bintoc(-1,"1")8位;bintoc(-1,"2")16位;bintoc(-1,"4")32位。
这样观察一下:
?STRCONV(BINTOC(-1,"1rs"),15)
?STRCONV(BINTOC(-1,"2rs"),15)
?STRCONV(BINTOC(-1,"4rs"),15)
但不支持无符号整数,下面语句会抛出“参数无效”异常。
?STRCONV(BINTOC(0xFF,"1rs"),15)
?STRCONV(BINTOC(0xFFFF,"2rs"),15)
?STRCONV(BINTOC(0xFFFFFFFF,"4rs"),15)





昨天 08:01
easyppt
Rank: 8Rank: 8
等 级:蝙蝠侠
威 望:1
帖 子:386
专家分:950
注 册:2021-11-24
收藏
得分:0 
不懂C,C++,所以对 类似这样的一组函数: BINTOC()    4rs  总是很抽象,希望吹能能开个专题帖子详细讲解一下,最好带上场景和例子

再此也祝大家双节快乐!!
昨天 08:06
吹水佬
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:451
帖 子:10747
专家分:43325
注 册:2014-5-20
收藏
得分:0 
以下是引用easyppt在2025-10-1 08:06:15的发言:

不懂C,C++,所以对 类似这样的一组函数: BINTOC()    4rs  总是很抽象,希望吹能能开个专题帖子详细讲解一下,最好带上场景和例子

再此也祝大家双节快乐!!

BINTOC()的那个"xRS"参数(x=1/2/4)可从上面提到的看出是转换为x个字节的字符串。
那个“.RS”(或其他)vfp帮助有说明,主要是字节顺序、符号位和数值类型等与位运算有关的参数。
可以用同一个数据观察一下不同的参数运行结果。

昨天 08:21
sam_jiang
Rank: 10Rank: 10Rank: 10
等 级:贵宾
威 望:14
帖 子:974
专家分:1516
注 册: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 表示负数)。
昨晚 19:04
sych
Rank: 7Rank: 7Rank: 7
等 级:黑侠
威 望:7
帖 子:429
专家分:660
注 册:2019-10-11
收藏
得分:0 
你检查一下你两段代码中的htons定义是否一致
昨晚 21:26
快速回复:htons()返回不同值的问题
数据加载中...
 
   



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

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