0

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

我现在正试图做相反的事情,但遇到了一些困难。这是我正在使用的测试结构。

 <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

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

任何帮助将不胜感激!

谢谢你。

4

1 回答 1

1

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

您使用大炮杀死蚊子,请改用 String.PadRight()。

于 2013-05-24T22:34:42.287 回答