webForumDet fria alternativet

Leta strängar i binärfiler?

.NETur .NET

6 svar · 306 visningar · startad av tonyh

Medlem sedan okt. 2002107 inlägg
Frågan#1

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?

Medlem sedan juni 20022 599 inlägg
#2

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 ..

Medlem sedan okt. 2002107 inlägg
#3

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!

Medlem sedan okt. 2002107 inlägg
#4

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...

Medlem sedan aug. 2001458 inlägg
#5

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));
	}
}
Medlem sedan okt. 2002107 inlägg
#6

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!

Medlem sedan okt. 2002107 inlägg
#7

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...

126 ms totalt · 3 externa anrop · v20260731065814-full.4bcf49fe
0 ms — hämta forumlista (cache)
0 ms — hämta statistik (cache)
123 ms — hämta tråd, inlägg och bilagor (db)