Autor Wątek: zmiana int, float na byte[]  (Przeczytany 2502 razy)

Offline ASTROMAG

  • Użytkownik

# Marzec 26, 2007, 19:58:47
Witam, na google znalazłem tylko jak zmienić stringa na byte[]
byte[] bAdam = Encoding.ASCII.GetBytes("Adam");
string sAdam = Encoding.ASCII.GetString(bAdam);
ale co i innymi typami(int, float, double,...), jak je zamienić na byte[]?
Potrzebuje tego do zapisu binarnego.

Z góry dziękuje za pomoc

ASTROMAG

Offline Mr. Spam

  • Miłośnik przetworów mięsnych

Offline KrystianD

  • Użytkownik
    • http://krystiand.net

# Marzec 26, 2007, 20:06:44
Możesz do tego wykorzystać klasę BinaryWriter w połączeniu z MemoryStream (bądź, jeżeli chcesz zapisywać bezpośrednio do pliku: BinaryWriter i FileStream).

Inaczej mówiąc, klasa BinaryWriter i BinaryReader dokonuje zapisu/odczytu do/ze strumienia (stream), a takim strumieniem może być MemoryStream (do pamięci), FileStream (do pliku), NetworkStream (sieć), CryptoStream (kryptografia).

Przykładowy kod:

MemoryStream ms = new MemoryStream ();
BinaryWriter bw = new BinaryWriter (ms);
bw.Write (10); // Obsługuje większość podstawowych typów (int, float, double, long, string, byte, itd...)
bw.Close ();
ms.Close ();
Byte[] data = ms.ToArray ();
« Ostatnia zmiana: Marzec 26, 2007, 20:20:17 wysłana przez Krystian D. »

Offline krajek

  • Użytkownik

# Marzec 26, 2007, 20:37:28
Cytuj
Potrzebuje tego do zapisu binarnego.

Jeśli interesuje cię zapis binarny, zainteresuj się serializacją w c#.
Temat jest szeroki, więc po szczegóły odsyłam do MSDN i książek. ;)

Offline nameczanin

  • Użytkownik
    • devlog

# Marzec 26, 2007, 21:30:51
Bodajze uzywa sie tez czegos takiego jak Marshal.

Offline KrystianD

  • Użytkownik
    • http://krystiand.net

# Marzec 26, 2007, 22:52:26
Cytuj
Potrzebuje tego do zapisu binarnego.

Jeśli interesuje cię zapis binarny, zainteresuj się serializacją w c#.
Temat jest szeroki, więc po szczegóły odsyłam do MSDN i książek. ;)
Serializacja jest może i dobra, ale dołącza mase niepotrzebnych danych. Przykład, klasa

public class A
{
public Int32 liczba;
public String tekst;
}

Zaserializowana:

Cytuj
   ÿÿÿÿ           JWindowsApplication2, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null   WindowsApplication2.Form1+A   liczbatekst    d       jakiÅ› tekst

I zapisana za pomocą BinaryWriter:

Cytuj
    jakiś tekst

Łatwo zauważyć że serializacja dodaje dane które są właściwie nikomu niepotrzebne, a tylko zwiększają rozmiar pliku (i o ile nie ma to może dużego znaczenia jeśli chodzi o plik, to jeśli chodzi o przesyłanie danych przez sieć w real-time to już robi różnice), natomiast za pomocą BinaryWriter'a zapisujesz tylko to co Twój program wymaga. Do obu technik i tak potrzeba tyle samo kodu, dlatego ja jednak wole używać BinaryWriter'a nad którym mam pełną kontrolę, ale każdy lubi co innego ;)

Bodajze uzywa sie tez czegos takiego jak Marshal.
:D Marshal to jest dopiero dziwadło :) choć dla osób przyzwyczajonych do C++ nie będzie to aż tak dziwne. Tu prosty przykład zamiany klasy na Byte[]:

[StructLayout (LayoutKind.Sequential)]
class CLS
{
[MarshalAs (UnmanagedType.ByValTStr, SizeConst = 10)]
public String s;
public Int32 d;
}

//Zamiana CLS na Byte[]
CLS c = new CLS ();
c.s = "ab";
c.d = 3;
Byte[] bt = new Byte[Marshal.SizeOf (c)];
IntPtr p = Marshal.AllocHGlobal (Marshal.SizeOf (c));
Marshal.StructureToPtr (c, p, false);
Marshal.Copy (p, bt, 0, Marshal.SizeOf (c));
Marshal.Release (p);

http://forum.warsztat.gd/index.php/topic,306.msg29084.html#msg29084

Jak widać lepiej użyć serializacji, bądź BinaryWriter'a ;)
« Ostatnia zmiana: Marzec 26, 2007, 22:59:07 wysłana przez Krystian D. »

Offline ASTROMAG

  • Użytkownik

# Marzec 27, 2007, 18:08:39
Dziękuje wszystkim za pomoc!! :)