15
Tags:
.net
Skrevet af
Bruger #4522
@ 20.04.2008
BufferStream: en deokoratør-stream
En buffer bruges til at forbedre en datastrøms ydeevne ved at fungere som et midlertidigt lager førend at data sendes videre. Stort set alle I/O-enheder har en form for buffer, bl.a. printere.
Når du udvikler programmer der gør brug af I/O-handlinger vil du som regel ønske at bruge en buffer da fordelene er så store, og heldigvis er det nemt i .NET. Du bruger blot den dekoratør-stream der hedder
BufferedStream. Da der her er tale om en dekoratør-stream skal den bruges på en allerede oprettet lager-stream. Da
FileStream har sin egen buffer indbygget, og man ikke bruger en buffer ved
MemoryStream vil man oftest kun bruge en buffer på en
NetworkStream (i nogle tilfælde kan det være givtigt af bruge en buffer på en
FileStream for på den måde at udvide dens allerede eksisterende buffer).
Følgende metode viser hvordan man kan bruge en
BufferedStream:
// Reading BufferedStream
public byte[] void GetBytesBufferedFromStream(Stream s)
{
// Here we create the BufferedStream by
// decorating an alread created backing-store stream
BufferedStream bf = new BufferedStream(s);
// Will hold our read bytes
byte[] bytesFromStream = new Byte[s.Length];
bf.Read(bytesFromStream, 0, s.Length);
return bf;
}
Kyptering af kommunikationen - CryptoStream: en dekoratør-stream
Noget data er konfidentiel og transmission af sådanne over nettet kræver at man påtager sig nogle sikkerhedshensyn. En måde at sikre kommunikation på er ved at kryptere indholdet med en hemmelig nøgle. Modtageren af beskeden kan da så afkode det sendte også ved anvendelse af en hemmelig nøgle. Afhængig af kypteringsalgoritmen er de to anvendte nøgler enten ens eller forskellig.
Ved at bruge
CryptoStream kan du i et .NET program meget nemt anvende ekstremt sofistikeret krypteringsteknikker til at sikre din kommunikation. Hvis sådanne sikkerheds foranstaltninger er nødvendige for dig så sørg altid for at anvende anerkendte krypteringsalgoritmer; der er ikke noget farligere, ud fra et sikkerheds synspunkt, end en kypteringsalgoritme udviklet af amatør kryptologer/matematikker. Overlad dette til dem der har brugt årevis på det og anvend i stedet én af de kendte algoritmer.
Via
CryptoStream kan du bruge følgende anerkendte krypteringsalgoritmer: DES (Data Encryption Standard, som dog ikke anses som sikker længere, så hold dig fra denne medmindre du har god grund til at anvende den), RC2 (Rivest Cipher), Rijndael (også kendt som AES: Advanced Encryption Standard) og triple DES (som er DES anvendt tre gange).
Følgende program illustreret hvordan man kan bruge en
CryptoStream til at skrive noget krypteret tekst til en fil:
using System.IO;
using System.Security.Cryptography;
using System.Text;
namespace Crypto
{
class Program
{
static void Main()
{
// Use the default algorithm which is Rijndael
SymmetricAlgorithm rijndael = SymmetricAlgorithm.Create();
// Now we create a cyrptographic transformation that
// makes it possible for us encrypt som data according
// to our created algortihm (Rijndael).
ICryptoTransform encryptTransform = rijndael.CreateEncryptor();
// Now we create the FileStream which is the file to which we want to write
// the encrypted text.
FileStream fs = new FileStream("InvasionPlans.dat", FileMode.Create, FileAccess.Write);
// Now we create the CryptoStream decorator which we wrap around our FileStream object
CryptoStream cs = new CryptoStream(fs, encryptTransform, CryptoStreamMode.Write);
// This is the secret message to our comrades in arms
string topSecret = "Attack his left flank at dawn.";
byte[] bytesToBeWritten = Encoding.ASCII.GetBytes(topSecret);
// Now write it to the file
cs.Write(bytesToBeWritten, 0, bytesToBeWritten.Length);
cs.Close();
fs.Close();
}
}
}
Det første vi gør er at oprette et
SymmetricalAlgorithm-objekt med den algoritme vi ønsker at bruge til krypteringen. Som udgangspunkt anvendes Rijndael og det gør vi også her (bemærk at som navnet antyder,
SymmetricalAlgorithm, er disse krypteringsalgoritmer symmetriske hvilket betyder at samme nøgle anvendes til både kryptering og dekryptering). Næste trin er at lave et objekt som repræsenterer den transformation vi ønsker, dvs. om vi ønsker at kryptere eller dekryptere. Da vi her ønsker at kryptere kalder vi
CreateEncryptor metoden på vores
SymmetricalAlgorithm-objekt, hvilket giver os et objekt af typen
ICryptoTransform som vi bruger senere til at lave et
CryptoStream-objekt. Men før vi når til det, opretter vi et
FileStream-objekt der repræsenterer den fil vi ønsker at skrive den krypteret tekst til. Nu opretter vi så et
CryptoStream-objekt, og det gøres ved at angive både vores
FileStream-objekt, vores
ICryptoTransform-objekt samt at vi ønsker skriverettigheder til kypterings-datastrømmen (det gør vi via den enum der hedder
CryptoStreamMode). Og endelig kan vi skrive den krypterede besked til filen ved at bruge
Write-metoden, fuldstændig på samme måde som vi har gjort i vores andre eksempler.
Efter at have kørt programmet kan du åbne den fil vi oprettede - InvasionsPlan.dat - for at se hvad der blev skrevet. I mit tilfælde blev der skrevet:
6Ä`M”ñèlêÔW.øvX‡3‰ ’‹ÝPwH‹<

Fÿg
Sådan en besked som er krypteret med Rijndael er ubrydelig såfremt der bruges en lang nok nøgle.
Et sidste eksempel: StreamReader
Faktisk kunne vi stort set klare det meste af vores I/O ønsker med det vi har set indtil videre. Vi kan læse hvad vi ønsker fra en datastrøm, og skrive hvad vi ønsker til en datastrøm.
Der er dog en lidt irriterende ting, og det er at vi sandsynligvis ønsker at læse og skrive tekst ganske tit, og så er det lidt irriterende at vi hele tiden selv skal sørge for at kode til og fra rene bytes for at det virker. Her kommer stream-adaptere til hjælp.
Til at håndtere tekst kan du gøre brug af klasserne
StreamReader og
StreamWriter. Følgende kodeeksempel illustrerer kort hvordan man kan bruge
StreamReader.
using System;
using System.IO;
namespace StreamReaderExample
{
class Program
{
static void Main()
{
FileStream fs = new FileStream("artikel.txt", FileMode.Open, FileAccess.Read);
StreamReader sr = new StreamReader(fs);
string line;
int lineCounter = 0;
while((line = sr.ReadLine()) != null)
{
Console.WriteLine("{0}: {1}", ++lineCounter, line);
}
sr.Close();
fs.Close();
}
}
}
Jeg starter med at oprette et
FileStream-objekt for en fil der indeholder en af mine tidligere artikler. Derefter oprettet jeg en
StreamReader så jeg kan læse tekst fra filen uden selv at skulle håndtere de enkelte bytes.
Eksemplet forsætter med en while-løkke der skriver alle tekstlinjer fra filen til konsollen. Til sidst husker jeg at kalde
Close() på min filstrøm og stream-adapter. Bemærk at jeg i modsætning til tidligere eksempler ikke har noget at gøre med nogle bytes her - jeg kan nøjes med blot at tænke på tekst og lader
StreamReader håndtere alle de underliggende detaljer.
Der findes også en stream-adapter til at håndtere primitive datatyper.
BinaryReader og
BinaryWriter kan respektive læse og skrive primitive datatyper.
BinaryReader har f.eks. metoder med navne som
ReadChar() og
ReadInt32().
Hvis du lave meget XML I/O er der også to klasser til det:
XmlReader og
XmlWriter.
Jeg har her kun overfladisk berørt stream-adaptere, men som du kan se fra ovenstående eksempel er de ligetil at bruge så kom bare i gang med at læse og skrive alt hvad du kan!
Afslutning
I denne artikel har vi kigget på brugen af stream i .NET. Jeg håber at du har fundet den informativ, og kan bruge det til noget.
Hvad synes du om denne artikel? Giv din mening til kende ved at stemme via pilene til venstre og/eller lægge en kommentar herunder.
Del også gerne artiklen med dine Facebook venner:
Kommentarer (2)
En meget god artikel. Jeg synes at når du begynder at skrive om MemoryStream, så er det synd du ikke går mere i dybden med det når du alligevel begynder at fortælle lidt om klassen. Der burde du måske bare have undværet det helt og så skrevet i starten at det ikke var med i artiklen. Ellers faldt jeg ikke over det helt store. Godt beskrivende og helt sikkert noget jeg kommer til at bruge. Keep up the good work
Tak for dine kommentarer Martin. Du har en pointe omkring MemoryStream og jeg vil prøve at uddybe det lidt mere i artiklen.
Du skal være
logget ind for at skrive en kommentar.