Как скопировать...

Язык Visual Basic на платформе .NET.

Модераторы: Ramzes, Sebas

Antonariy
Повелитель Internet Explorer
Повелитель Internet Explorer
Аватара пользователя
 
Сообщения: 4824
Зарегистрирован: 28.04.2005 (Чт) 14:33
Откуда: Мимо проходил

Как скопировать...

Сообщение Antonariy » 23.01.2006 (Пн) 10:25

... переменную типа long или private type в байтовый массив? В vb6 для этого была CopyMemory
Лучший способ понять что-то самому — объяснить это другому.

Sebas
Неуловимый Джо
Неуловимый Джо
Аватара пользователя
 
Сообщения: 3626
Зарегистрирован: 12.02.2002 (Вт) 17:25
Откуда: столько наглости такие вопросы задавать

Сообщение Sebas » 23.01.2006 (Пн) 11:15

Public NotInheritable Class Marshal
Inherits System.Object
Member of: System.Runtime.InteropServices
Summary:
Provides a collection of methods for allocating unmanaged memory, copying unmanaged memory blocks, and converting managed to unmanaged types, as well as other miscellaneous methods used when interacting with unmanaged code.
- Я никогда не понимал, почему они приходят ко мне чтобы умирать?

sebas<-@->mail.ru

Antonariy
Повелитель Internet Explorer
Повелитель Internet Explorer
Аватара пользователя
 
Сообщения: 4824
Зарегистрирован: 28.04.2005 (Чт) 14:33
Откуда: Мимо проходил

Сообщение Antonariy » 23.01.2006 (Пн) 12:30

А поточнее? Этот неймспейс содержит туеву хучу классов, своими силами я час ковыряться буду.
Лучший способ понять что-то самому — объяснить это другому.

GSerg
Шаман
Шаман
 
Сообщения: 14286
Зарегистрирован: 14.12.2002 (Сб) 5:25
Откуда: Магадан

Сообщение GSerg » 23.01.2006 (Пн) 12:35

Тебе же сказали - Public NotInheritable Class Marshal...
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

Antonariy
Повелитель Internet Explorer
Повелитель Internet Explorer
Аватара пользователя
 
Сообщения: 4824
Зарегистрирован: 28.04.2005 (Чт) 14:33
Откуда: Мимо проходил

Сообщение Antonariy » 23.01.2006 (Пн) 12:38

Не заметил, когда приводятся вырезки из msdn, читаю по диагонали :oops:
Лучший способ понять что-то самому — объяснить это другому.

Antonariy
Повелитель Internet Explorer
Повелитель Internet Explorer
Аватара пользователя
 
Сообщения: 4824
Зарегистрирован: 28.04.2005 (Чт) 14:33
Откуда: Мимо проходил

Сообщение Antonariy » 30.01.2006 (Пн) 10:57

Работаем дальше...
Код: Выделить всё
Imports System.Runtime.InteropServices.Marshal

Public Class Form1
    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
        Dim x As Integer
        Dim y() As Byte
        ReDim y(3)
        x = 23456
        Copy(x, y, 0, 4)
    End Sub
End Class

В момент копирования возникает ошибка AccessViolationException. Что не так?
Лучший способ понять что-то самому — объяснить это другому.

GSerg
Шаман
Шаман
 
Сообщения: 14286
Зарегистрирован: 14.12.2002 (Сб) 5:25
Откуда: Магадан

Сообщение GSerg » 30.01.2006 (Пн) 11:41

Не знаю, как это скомпилировалось, наверное в 2005 чё-то добавили...

Вообще, неверной дорогой идёте, товарищи...

Dim arr() As Byte
arr = System.BitConverter.GetBytes(23456)
MsgBox(arr(1))
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

Viper
Артефакт VBStreets
Артефакт VBStreets
Аватара пользователя
 
Сообщения: 4394
Зарегистрирован: 12.04.2005 (Вт) 17:50
Откуда: Н.Новгород

Сообщение Viper » 30.01.2006 (Пн) 12:11

что то не припоминаю я метода Copy в классе Marshal с такой сигнатурой чтоб из целого числа копировал в массив байтов... Есть метод, который копирует участок памяти, указываемый через указатель в массив байтов... похоже здесь 23456 воспринимается как указатель и вот тебе и ошибка... А из целого в байтовый массив или наоборот это как у GSerg
Весь мир матрица, а мы в нем потоки байтов!

Antonariy
Повелитель Internet Explorer
Повелитель Internet Explorer
Аватара пользователя
 
Сообщения: 4824
Зарегистрирован: 28.04.2005 (Чт) 14:33
Откуда: Мимо проходил

Сообщение Antonariy » 30.01.2006 (Пн) 13:10

!Viper!
public static void Copy(IntPtr source, byte[ ] destination, int startIndex, int length)
Member of System.Runtime.InteropServices.Marshal

Еще я пытался передать вместо х ReadIntPtr(x,0) - аналогично.

А если мне нужно скопировать собственный тип?
Код: Выделить всё
    Private Structure httpHeader
        Dim Block1 As Integer
        Dim Block2 As Integer
        Dim Block3 As Integer
    End Structure
В битконвертере ничего подходящего вроде нет.
Лучший способ понять что-то самому — объяснить это другому.

Sebas
Неуловимый Джо
Неуловимый Джо
Аватара пользователя
 
Сообщения: 3626
Зарегистрирован: 12.02.2002 (Вт) 17:25
Откуда: столько наглости такие вопросы задавать

Сообщение Sebas » 30.01.2006 (Пн) 14:37

Если тебе нужно в бит() для передачи, то просто сериализуй её...
- Я никогда не понимал, почему они приходят ко мне чтобы умирать?

sebas<-@->mail.ru

Antonariy
Повелитель Internet Explorer
Повелитель Internet Explorer
Аватара пользователя
 
Сообщения: 4824
Зарегистрирован: 28.04.2005 (Чт) 14:33
Откуда: Мимо проходил

Сообщение Antonariy » 30.01.2006 (Пн) 14:51

Это как?
Лучший способ понять что-то самому — объяснить это другому.

Antonariy
Повелитель Internet Explorer
Повелитель Internet Explorer
Аватара пользователя
 
Сообщения: 4824
Зарегистрирован: 28.04.2005 (Чт) 14:33
Откуда: Мимо проходил

Сообщение Antonariy » 31.01.2006 (Вт) 10:07

Sebas писал(а):Если тебе нужно в бит() для передачи, то просто сериализуй её...
Это как??
Лучший способ понять что-то самому — объяснить это другому.

Dmitriy Solomnikov
Постоялец
Постоялец
 
Сообщения: 407
Зарегистрирован: 10.11.2004 (Ср) 13:04
Откуда: Москва

Сообщение Dmitriy Solomnikov » 31.01.2006 (Вт) 10:55

набери в MSDN в индексе serialization, и возьме первый попавшийся пример

Viper
Артефакт VBStreets
Артефакт VBStreets
Аватара пользователя
 
Сообщения: 4394
Зарегистрирован: 12.04.2005 (Вт) 17:50
Откуда: Н.Новгород

Сообщение Viper » 31.01.2006 (Вт) 12:36

Ну можно еще долго издеваться над памятью методами класса Marshal. Дело непростое, нудное, требуещее внимательного чтения Help и долгих опытов... Но скопировать содержимое структуры в байты в принципе можно...

А мож сериализацией и проще...

Можно и в том и в том направлении покопать...
Весь мир матрица, а мы в нем потоки байтов!

Antonariy
Повелитель Internet Explorer
Повелитель Internet Explorer
Аватара пользователя
 
Сообщения: 4824
Зарегистрирован: 28.04.2005 (Чт) 14:33
Откуда: Мимо проходил

Сообщение Antonariy » 31.01.2006 (Вт) 12:44

В MSDN описана сериализация объектов в XML. Не вижу, как мне это может помочь.
Лучший способ понять что-то самому — объяснить это другому.

Dmitriy Solomnikov
Постоялец
Постоялец
 
Сообщения: 407
Зарегистрирован: 10.11.2004 (Ср) 13:04
Откуда: Москва

Сообщение Dmitriy Solomnikov » 31.01.2006 (Вт) 12:50

не только

Код: Выделить всё
public class MyObject {
  public int n1 = 0;
  public int n2 = 0;
  public String str = null;
}

The code example below shows how an instance of this class can be serialized to a file.
MyObject obj = new MyObject();
obj.n1 = 1;
obj.n2 = 24;
obj.str = "Some String";
IFormatter formatter = new BinaryFormatter();
Stream stream = new FileStream("MyFile.bin", FileMode.Create, FileAccess.Write, FileShare.None);
formatter.Serialize(stream, obj);
stream.Close();

Restoring the object back to its former state is just as easy. First, create a stream for reading and a formatter, and then instruct the formatter to deserialize the object. The code example below shows how this is done.
IFormatter formatter = new BinaryFormatter();
Stream stream = new FileStream("MyFile.bin", FileMode.Open, FileAccess.Read, FileShare.Read);
MyObject obj = (MyObject) formatter.Deserialize(stream);
stream.Close();

// Here's the proof.
Console.WriteLine("n1: {0}", obj.n1);
Console.WriteLine("n2: {0}", obj.n2);
Console.WriteLine("str: {0}", obj.str);

Antonariy
Повелитель Internet Explorer
Повелитель Internet Explorer
Аватара пользователя
 
Сообщения: 4824
Зарегистрирован: 28.04.2005 (Чт) 14:33
Откуда: Мимо проходил

Сообщение Antonariy » 31.01.2006 (Вт) 13:52

В общем, все не то. Вот правильный ответ:
Imports System.Runtime.InteropServices.Marshal

Код: Выделить всё
Public Class Form1
    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
        Dim x As Integer
        Dim i As IntPtr
        Dim y() As Byte
        ReDim y(3)
        i = AllocCoTaskMem(4)
        x = 23456
        WriteInt32(i, 0, x)
        Copy(i, y, 0, 4)
    End Sub
End Class

Всем спасибо.
Лучший способ понять что-то самому — объяснить это другому.

Viper
Артефакт VBStreets
Артефакт VBStreets
Аватара пользователя
 
Сообщения: 4394
Зарегистрирован: 12.04.2005 (Вт) 17:50
Откуда: Н.Новгород

Сообщение Viper » 01.02.2006 (Ср) 12:21

Antonariy писал(а):В общем, все не то. Вот правильный ответ:
Imports System.Runtime.InteropServices.Marshal

Код: Выделить всё
Public Class Form1
    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
        Dim x As Integer
        Dim i As IntPtr
        Dim y() As Byte
        ReDim y(3)
        i = AllocCoTaskMem(4)
        x = 23456
        WriteInt32(i, 0, x)
        Copy(i, y, 0, 4)
    End Sub
End Class

Всем спасибо.


А на кой тебе понадобилось распределить память из COM? Если уж пондобилась именно эта память, то после того как стоит ее освободить методом FreeCoTaskMem.

А в правильном решении вместо AllocCoTaskMem необходимо использовать AllocHGlobal и освобождать после использования память методом freeHGlobal. Все эти методы естественно в классе Marshal.
Весь мир матрица, а мы в нем потоки байтов!


Вернуться в Visual Basic .NET

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 77

    TopList