积极答复者
数组类型代替指针类型后遇到的“大”问题

问题
-
C++写的控件的一个方法是SetData(float FAR* pSourceData, long TotalPointNum)
其中FAR*指针要存入的是一个长度为4096字节的二进制数据(理论上这4096字节里有1024个点数据)
后来因为控件在网页中使用将这个指针类型改成了数组类型
控件能调用了 可是读取到的数据确和原来不一样了
我是这样做的:我把那个长4096字节的数据每四个字节截取成一个1024个元素的数组传给上述方法,得到的处理结果却大不一样
这是为什么??怎么样截取才能消除这种差异??
注:网页中用的脚本语言是vbscript,如果我对问题的描述还有让你不清楚的地方请慷慨留言发问 不胜感激
答案
-
研究了一天 终于发现原来是float型数据用16进制表示的时候会有颠倒的问题:比如说一个float型转换成16进制数后是“9A014D3C” 要想把这个数还原成float型得用字符串“3C4D019A”还原才能成功。这涉及的是计算机原理里的东西了
我也才刚知道 将这点信息反馈给关注本帖的人 想要明白具体怎么回事的人可以参看http://www.mcustudio.com/jixue/ShowArticle.asp?ArticleID=195
谢谢大家的关注 特别感谢两位顶贴的高手
全部回复
-
经过这两天查资料我觉得问题应该是出在数据转换上。 存在数据库里的那个Image类型的长二进制数据[这个数据的组成是这样的:长度为4096字节、二进制 如果用指针读取,即float FAR*这样的指针,刚好是每四个字节一读取并随之转换成这4字节内存单元对应的float型数据]
而网络传输的时候我在服务器上将其用C#中的xmlWriter类的WriterBinHex()方法转换成了16进制的总共8192字节的字符,再将这个16进制的长字符串按8字符截取完了之后转换成二进制数的时候 不知道其中发生了什么样的差别 进一步研究中…… 希望大家继续关注 谢谢
-
FAR这样的指针好像只是在16位机的时代才有作用,因为那个时候操作系统的内存分段和分页存储,而且程序可以直接访问物理内存,例如在同一内存段或内存页的指针叫做near,而不同内存页的指针叫做far,32位Windows引入虚拟内存的概念,用户程序已经不能支持访问和处理物理内存了,因此far和near的概念就已经消失了。
我觉得你的C++函数声明应该有问题,你的C++函数声明应该是:
SetData(SAFEARRAY *psaSourceData)
而且你的IDL文件里面,接口的声明应该是:
SetData([in] SAFEARRAY(float) psaSourceData) -
研究了一天 终于发现原来是float型数据用16进制表示的时候会有颠倒的问题:比如说一个float型转换成16进制数后是“9A014D3C” 要想把这个数还原成float型得用字符串“3C4D019A”还原才能成功。这涉及的是计算机原理里的东西了
我也才刚知道 将这点信息反馈给关注本帖的人 想要明白具体怎么回事的人可以参看http://www.mcustudio.com/jixue/ShowArticle.asp?ArticleID=195
谢谢大家的关注 特别感谢两位顶贴的高手