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))
发现每个结构中少最后一个字符,这是什么原因造成的,该如何解决,谢谢。 展开
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(财富值+成长值)
1个回答
展开全部
这个是由于你定义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)
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)
本回答被提问者采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询