как скопировать из текстового поля в структуру C # - PullRequest
0 голосов
/ 29 октября 2010

Мне нужно скопировать строки из текстового поля в структуру. есть ли способ сделать это? вот что я пытаюсь:

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 Ответ

3 голосов
/ 29 октября 2010

Где вы собираетесь использовать эту структуру - я полагаю, для вызова некоторого API стиля Win32. Таким образом, правильная реализация будет зависеть от того, что ищет этот 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
}

Здесь мы говорим, что мы будем явно планировать структуру (используя смещение поля) и затем предоставим информацию для каждого поля. Эта структура, вероятно, будет эквивалентна тому, что вы хотите. Или вы должны играть с этими атрибутами в соответствии с вашими требованиями.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...