Marshal结构指针然后指向unicode字符串VB.Net

时间:2013-05-24 21:29:44

标签: vb.net visual-studio-2008 character-encoding marshalling

我们的客户需要将数据从结构移动到字符串中,以便将其运送到大型机。我们的进程基本上是将数据从字符串编组到结构中,这部分很容易......

我正在尝试反过来,遇到了一些困难。这是我正在使用的测试结构。

 <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

现在结果变量只获取结构“地址”中的第一个字段...看起来像是指针很多没有分配足够的空间?想知道如何将其余数据放入字符串...

非常感谢任何帮助!

谢谢。

1 个答案:

答案 0 :(得分:1)

嗯,是的,这是预期的结果。 Marshal.PtrToStringUni()将终止于嵌入式零,即C语言中字符串的字符串终止符。这将出现在结构中,因为字符串不会填充整个字段。并且由Marshal.StructureToPtr()生成,因为它假定C程序将读取结构。

你用大炮杀死一只蚊子,改用String.PadRight()。