我需要将字符串从文本框复制到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);
}
以及其他方式。它不工作.. :(任何帮助非常感谢
答案 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
}
这里,我们说我们将显式布局结构(使用字段偏移),然后为每个字段提供信息。这个结构可能等同于你想要的结果。或者你必须按照你的要求玩这些属性。