如何从文本框复制到struct C#

时间:2010-10-29 07:59:48

标签: c# .net struct

我需要将字符串从文本框复制到struct。有什么办法吗?这是我的尝试:

public unsafe struct mystruc
{
    public byte[] install_name; // size limit 32 bytes
    public byte[] install_id;   // size limit 4 bytes
    public byte[] model_name;   // size limit 4 bytes
};

private void read_b_Click(object sender, EventArgs e)
{
    mystruc mstruc1 = new mystruc();

    //copy from textbox to struct    
    mstruc.install_name = Encoding.UTF8.GetBytes(installation_name_tb.Text);
    mstruc.install_id = Encoding.UTF8.GetBytes(installation_id_tb.Text);
    mstruc.model_name = Encoding.UTF8.GetBytes(model_tb.Text);    
}

以及其他方式。它不工作.. :(任何帮助非常感谢

1 个答案:

答案 0 :(得分:3)

你打算在哪里使用这个结构 - 我相信会调用一些Win32风格的API。因此,正确的实现将取决于API正在寻找什么。例如,如果需要ASCII字符(char),则需要使用ASCIIEncoding。如果期望unicode字符(WCHAR),那么你应该使用UnicodeEncoding。我建议你分享那个api以获得更多有用的答案。

编辑:我不确定您是否正在调用任何非托管DLL,或者您是如何确定结构布局的,但以下信息可能有用:

如果想要写入结构的内容,你假设它的长度为40个字节(三个内联数组为32,4和4个字节),那么它将无法在.NET中“按原样”工作。这是因为,数组是引用类型(指向其他地方的内存的指针),而.NET可以选择字段偏移以便对齐字边界 - 因此解决方案是使用属性来标记该结构布局。例如,

[StructLayout(LayoutKind.Explicit, CharSet = CharSet.Ascii)]
public struct mystruc
{
    [MarshalAs(UnmanagedType.ByValArray, SizeConst = 32)]
    [FieldOffset(0x00)]
    public byte[] install_name; // size limit 32 bytes

    [MarshalAs(UnmanagedType.ByValArray, SizeConst = 4)]
    [FieldOffset(0x33)]
    public byte[] install_id;   // size limit 4 bytes

    [MarshalAs(UnmanagedType.ByValArray, SizeConst = 4)]
    [FieldOffset(0x37)]
    public byte[] model_name;   // size limit 4 bytes
}

这里,我们说我们将显式布局结构(使用字段偏移),然后为每个字段提供信息。这个结构可能等同于你想要的结果。或者你必须按照你的要求玩这些属性。