C#调用delphi记录结构体问题

delphi代码:1、定义的结构体TestRecord=recordA:array[0..5]ofchar;B:array[0..6]ofchar;C:array[0..... delphi代码:
1、定义的结构体
TestRecord=record
A: array[0..5] of char;
B: array[0..6] of char;
C:array[0..7] of char;
end;
2、 delphi调用函数
function test(trecord:TestRecord):integer ;stdcall ;

c#代码:
1、c#针对delphi定义的结构体
[System.Runtime.InteropServices.StructLayout(System.Runtime.InteropServices.LayoutKind.Sequential)]
public struct TestRecord
{
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 6)]
public string A;
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 7)]
public string B;
[MarshalAs(UnmanagedType.ByValTStr, SizeConst =8)]
public string C;
}
2、声明调用的接口
[DllImport("Jx104.dll")]
public static extern int test(TestRecord t);
3、c#调用初始化代码
TestRecord t = new TestRecord();
t.A = "abcdef";// +((char)0).ToString();
t.B = "1234567";//+ ((char)0).ToString();
t.C = "98765432";//+ ((char)0).ToString();
JX104NET_API.test(t);

现在问题直接调用后在delphi是监控中显示结果是:
(('a', 'b', 'c', 'd', 'e', #0), ('1', '2', '3', '4', '5', '6', #0), ('9', '8', '7', '6', '5', '4', '3', #0))
发现每个结构中少最后一个字符,这是什么原因造成的,该如何解决,谢谢。
展开
 我来答
  • 你的回答被采纳后将获得:
  • 系统奖励15(财富值+成长值)+难题奖励30(财富值+成长值)
wooden954
推荐于2016-11-10 · TA获得超过1万个赞
知道大有可为答主
回答量:6135
采纳率:93%
帮助的人:820万
展开全部
这个是由于你定义C#不正确造成的。
C#里(C也一样),字符串的最后都有\0结束符。你定义的C#语句public string A;的长度是6,那么它的实际允许存储的字符串为5,因为最后一个得保留存储\0.
你在赋值时,字符串"abcdef"的实际存储结构是“abcdef\0”它实际需要占用7个字节。而系统为了保证长度不越界,只能将数据截断成“abcde\0”,这也就是你在Delphi中看到的是('a', 'b', 'c', 'd', 'e', #0),的原因(C中的\0实际的ASCII值就是0,所以Delphi中最后一个字符是#0)
本回答被提问者采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式