如何用delphi处理VC中的位域?(100分)

  • 主题发起人 主题发起人 crazyjimmy
  • 开始时间 开始时间
C

crazyjimmy

Unregistered / Unconfirmed
GUEST, unregistred user!
DELPHI中没有这样的语法<br>不过可以写函数,用位移方法读数据
 
XuDunYu:<br>实际上很简单啊,你只要弄明白在c中 &nbsp; <br>&nbsp; typedef &nbsp; struct &nbsp; { &nbsp; <br>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; unsigned &nbsp; char &nbsp; &nbsp; &nbsp; npi:5; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <br>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; unsigned &nbsp; char &nbsp; &nbsp; &nbsp; ton:3; &nbsp; <br>&nbsp; } &nbsp; smpp; &nbsp; <br>&nbsp; &nbsp; <br>&nbsp; smpp &nbsp; &nbsp; a; &nbsp; <br>&nbsp; 这个a是怎么存储不就行了吗,应该是连续占用一个字节的内存 &nbsp; <br>&nbsp; &nbsp; <br>&nbsp; 那么你不需要任何的数据结构,直接就用一个指向字符的指针来完成不就行了吗 &nbsp; <br>&nbsp; 取得这个字符后,高5位是npi,低3位是ton,也许刚好反过来,你试一下不就有了吗?<br><br>to &nbsp; xudunyu &nbsp; <br>&nbsp; 那么你不需要任何的数据结构,直接就用一个指向字符的指针来完成不就行了吗 &nbsp; <br>&nbsp; 取得这个字符后,高5位是npi,低3位是ton,也许刚好反过来,你试一下不就有了吗? &nbsp; <br>&nbsp; &nbsp; <br>&nbsp; 我读取他的a这个结构的内容时这样当然可以像你说的那样。但是如果我通过clientSendMsg(a)这个函数把a这个结构的内容传给他的程序的时候这就不一定可以用了,因为他的程序是用vc写的,所以他读里面内容的时候就是用例如:b=a.npi。这个时候我里面如果没有这个npi那他就读不到了。
 
在代码被程序编译后,程序只认数据,不会认你的结构体的,只要你在Delphi中传的数据大小和VC定义的位域大小是正确的,在VC中就可以正确读到相应的数据。如:<br>//VC Dll输出读取smpp数据函数<br>typedef struct{ &nbsp; <br>&nbsp; unsigned char npi:5; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <br>&nbsp; unsigned char ton:3; &nbsp; <br>}smpp;<br>unsigned char ReadSmpp(smpp *s)<br>{<br>&nbsp; return (unsigned char)(s-&gt;npi | (s-&gt;ton &lt;&lt; 5));<br>}<br><br>//在Delphi中调用。<br>Function ReadSmpp(pc:pChar):Char; cdecl; external 'DllName.dll';<br>var smpp:Char;<br>begin<br>&nbsp; smpp := 'c';<br>&nbsp; ShowMessage(ReadSmpp(@smpp)); // 这里显示的还是'c',因为我前面的ReadSmpp函数操作只是以smpp结构操作还原了'c'的值,并没有改变'c'的值。<br>end;
 
多人接受答案了。
 
后退
顶部