Kanske är ute och cyklar, men kan man inte använda en streamreader och bara tala om att man inte vill tolka binärdatan som UniCode?
Typ:
new StreamReader(mFileStream1, Encoding.ASCII);
eller nåt liknande ..
6 svar · 306 visningar · startad av tonyh
Hej!
Jag försöker hitta ett smidigt sätt att öppna och manipulera en binärfil i C#, vill leta mig fram till ett antal positioner i binärfilen(parsa data).
I min binära fil är jag t.ex. intresserad av om teckenkombinationen {'M','B','I'} (altså hex 4D,42,49) existerar...
Började med att använda en StreamReader.ReadToEnd men denna går inte att använda då den läser två tecken i taget och gör detta till ett tecken, ty om man skulle konverera returnerade strängen till en char array så skulle varje char bestå av två byte(p.g.a unicode historian eller ngt).
Bytte då till BinaryReader.Readbytes vilket gör att jag har en lång byte-array av fildata som jag vill matcha emot min lilla egna "MBI"-array som också är av typen byte-array. Hur kan jag testa dessa funktioner mot varann?
Har provat att slänga in dessa byte arrayer i en sträng men detta går dock inte då en sträng konstruktor inte tar emot bytearrayer utan det måste vara åtminstonde en chararray.
Hade tänkt att göra en typ:
string fileStr = new string(fileByteArray);
string matchStr = new string(matchByteArray);
int pos = fileStr.IndexOf(matchStr);
Det bör finnsa många smidigare sätt att matcha bytearrayer, några förslag?
Kanske är ute och cyklar, men kan man inte använda en streamreader och bara tala om att man inte vill tolka binärdatan som UniCode?
Typ:
new StreamReader(mFileStream1, Encoding.ASCII);
eller nåt liknande ..
Jag hade också hoppats på det men förstod det som att alla (
System.Text.ASCIIEncoding
System.Text.UnicodeEncoding
System.Text.UTF7Encoding
System.Text.UTF8Encoding)
text encodings läste två byte per tecken, men så kansk inte är fallet, skall prova!
Tack det verkar funka fint...
Men om någon arbetat på något smidigare sätt då de letat data i binära filer så uppskattas tips...
Jag vet inte på rak arm något sätt att söka efter en sub-array i en annan array. Men du kan använda Array.IndexOf såhär:
static void Main()
{
using (FileStream fs = new FileStream(@"c:\data.bin", FileMode.Open, FileAccess.Read, FileShare.Read))
{
BinaryReader br = new BinaryReader(fs);
Byte[] buffer = br.ReadBytes((int)fs.Length);
const Char lookForAsChar = 'M';
const Byte lookForAsByte = (Byte) lookForAsChar;
Console.WriteLine("IndexOf('{0}') = {1}", lookForAsChar, Array.IndexOf(buffer, lookForAsByte));
}
}
Mmmm...
Ganska användbart kodexempel men jag skulle gärna vilja testa emot en teckenkombination, men jag antar väll att jag blir tvungen att göra en funktion av detta som utgår ifrån Array.IndexOf(x,y)... = lite kanske man måste koda själv ;)
Tack en än gng!
gjorde en funktion likt denna:
private int matchByte(byte[] FindIn, byte[] FindThis)
{
int startPos = Array.IndexOf(FindIn, FindThis[0])+1;
int i=0;
if(startPos > 0)
{
i = startPos;
for(int n=1; n<FindThis.Length; n++)
{
if(FindIn[i++] != FindThis[n])
{
return -1;
}
}
}
return startPos;
}
vilket verkar fungera...