| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
共有 1405 人关注过本帖
标题:ctobin函数的局限性
只看楼主 加入收藏
sam_jiang
Rank: 10Rank: 10Rank: 10
等 级:贵宾
威 望:14
帖 子:1094
专家分:1663
注 册:2021-10-13
收藏
 问题点数:0 回复次数:13 
ctobin函数的局限性
最近在编程的过程中发现ctobin函数的一个局限性,导致无法将字节表示的数据转换为整数。

举个例子说明:

cstr=repli(chr(255),4) &&16进制字符串 FF FF FF FF,可以表示的整数是4294967295
?ctobin(cstr,"4s") &&-1


进一步尝试,发现ctobin函数支持的最大整数是2^31-1,即2147483647,查了帮助发现,它支持的整数值在-2147483647 to 2147483647 之间。

这就是我用ctobin函数时,出现莫名其妙的原因。。。

也就是说,要换算上面那个FF FF FF FF 的数时,就要另外编写个转换的程序。

知道了产生问题的原因,解决起来就简单了,这里提供一个简单方法,可以将以任意字符保存的值转换为整数。

cstr=repli(chr(255),4) &&16进制字符串 FF FF FF FF,可以表示的整数是4294967295
?eval("0x"+strc(cstr,15)) &&4294967295


上面的程序可以将任意字符表示的数值转换成10进制的,特简单。
搜索更多相关主题的帖子: 函数 表示 FF 转换 整数 
2026-02-06 22:44
吹水佬
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:451
帖 子:11176
专家分:43605
注 册:2014-5-20
收藏
得分:0 
m = ctobin(cstr,"4s")
m = m + iif(m<0, 2^32, 0)


2026-02-06 23:27
sam_jiang
Rank: 10Rank: 10Rank: 10
等 级:贵宾
威 望:14
帖 子:1094
专家分:1663
注 册:2021-10-13
收藏
得分:0 
以下是引用吹水佬在2026-2-6 23:27:33的发言:

m = ctobin(cstr,"4s")
m = m + iif(m<0, 2^32, 0)


cstr 为FF FF FF FF 时,第一句就报错了。
2026-02-06 23:34
sych
Rank: 8Rank: 8
等 级:蝙蝠侠
威 望:7
帖 子:469
专家分:746
注 册:2019-10-11
收藏
得分:0 
我一般直接这样使用,可以直接转换成0-4294967295
ctobin(cstr)+2^31
2026-02-07 07:20
吹水佬
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:451
帖 子:11176
专家分:43605
注 册:2014-5-20
收藏
得分:0 
以下是引用sam_jiang在2026-2-6 23:34:18的发言:

cstr 为FF FF FF FF 时,第一句就报错了。

是不是 cstr 的问题,这样试:
? CTOBIN(0hFFFFFFFF,"4s")
2026-02-07 07:50
吹水佬
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:451
帖 子:11176
专家分:43605
注 册:2014-5-20
收藏
得分:0 
以下是引用sych在2026-2-7 07:20:48的发言:

我一般直接这样使用,可以直接转换成0-4294967295
ctobin(cstr)+2^31


各种模式试试:

?CTOBIN(BINTOC(0x00000000))+2^31
?CTOBIN(BINTOC(0x00000000,"4r"))+2^31
?CTOBIN(BINTOC(0x00000000,"4s"))+2^31
?CTOBIN(BINTOC(0x00000000,"4rs"))+2^31
?
?CTOBIN(BINTOC(-1))+2^31
?CTOBIN(BINTOC(-1,"4r"))+2^31
?CTOBIN(BINTOC(-1,"4s"))+2^31
?CTOBIN(BINTOC(-1,"4rs"))+2^31

2026-02-07 08:08
sych
Rank: 8Rank: 8
等 级:蝙蝠侠
威 望:7
帖 子:469
专家分:746
注 册:2019-10-11
收藏
得分:0 
VFP中涉及这个问题一般是处理win32api参数时或内存偏移量的转换中,所以我才用到ctobin(cstr)+2^31,我的代码都是群里照搬硬套的,理解估计会有所偏差
2026-02-07 08:37
iswith
Rank: 8Rank: 8
等 级:蝙蝠侠
威 望:5
帖 子:769
专家分:736
注 册:2013-5-14
收藏
得分:0 
因为你是个win32
2026-02-07 15:09
sam_jiang
Rank: 10Rank: 10Rank: 10
等 级:贵宾
威 望:14
帖 子:1094
专家分:1663
注 册:2021-10-13
收藏
得分:0 
ctobin,最大只能转化7F FF FF FF
2026-02-09 15:26
吹水佬
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:451
帖 子:11176
专家分:43605
注 册:2014-5-20
收藏
得分:0 
vfp的按位运算函数都是按32位有符号处理,没有32位无符号类型,当正整数值超过32位有符号限制时会变成负数。
如 BITOR()函数:
?BITOR(0x7FFFFFFF,0)==2147483647    显示 .t.
?BITOR(0x80000000,0)==2147483648    显示 .f.
?BITOR(0x80000000,0) == -2147483648 显示 .t.

2026-02-09 20:59
快速回复:ctobin函数的局限性
数据加载中...
 
   



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

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