我们的客户需要将数据从结构移动到字符串中,以便将其运送到大型机。我们的进程基本上是将数据从字符串编组到结构中,这部分很容易......
我正在尝试反过来,遇到了一些困难。这是我正在使用的测试结构。
<StructLayout(LayoutKind.Sequential, CharSet:=CharSet.Unicode)> _
Public Structure Contact
<MarshalAs(UnmanagedType.ByValTStr, SizeConst:=50)> _
Public Address As String
<MarshalAs(UnmanagedType.ByValTStr, SizeConst:=20)> _
Public FirstName As String
<MarshalAs(UnmanagedType.ByValTStr, SizeConst:=20)> _
Public LastName As String
<MarshalAs(UnmanagedType.ByValTStr, SizeConst:=12)> _
Public PhoneNumber As String
End Structure
这是我正在使用的测试方法:
Public Sub TestContactToString()
Dim contact As New Contact
contact.Address = "123 Main st."
contact.FirstName = "Bob"
contact.LastName = "Builder"
contact.PhoneNumber = "613-828-1233"
Dim unmanagedAddress As IntPtr = Marshal.AllocHGlobal(Marshal.SizeOf(contact))
Marshal.StructureToPtr(contact, unmanagedAddress, True)
Dim result As String = Marshal.PtrToStringUni(unmanagedAddress)
Marshal.FreeHGlobal(unmanagedAddress)
unmanagedAddress = IntPtr.Zero
End Sub
现在结果变量只获取结构“地址”中的第一个字段...看起来像是指针很多没有分配足够的空间?想知道如何将其余数据放入字符串...
非常感谢任何帮助!
谢谢。
答案 0 :(得分:1)
嗯,是的,这是预期的结果。 Marshal.PtrToStringUni()将终止于嵌入式零,即C语言中字符串的字符串终止符。这将出现在结构中,因为字符串不会填充整个字段。并且由Marshal.StructureToPtr()生成,因为它假定C程序将读取结构。
你用大炮杀死一只蚊子,改用String.PadRight()。