webForumDet fria alternativet

Läsa binary fil

.NETur .NET

9 svar · 692 visningar · startad av saw

sawMedlem sedan mars 20011 880 inlägg
#1

Jag återkommer till ett gammalt problem. Jag spelar lite musik och i mitt
keyboard så kan man via floppydisk ladda in nya styler(USER01.STY t ex)
I denna fil så finns bl a titel osv inkl stylerna. Nu skulle jag vilja kunna läsa in
dessa viler, se titlarna, spara i databas för att senare kunna göra egna styler.

Jag har letat runt och hittat lite men jag får inte fram någonting av värde.
Någon som har något tips som kan ge mig en skjuts framåt?

:stud

sawMedlem sedan mars 20011 880 inlägg
#2

Genom att tita i en hexa-editor så kan jag se hur strukturen ser ut:
Jag bifoga en bild på det.
Jag kan tyvärr inte ladda upp en kopia av sty-filen, men om någon är
intresserad så kan jag maila.

Så här långt har jag kommit:

Stream myStream;
string flPath = @"A:\DIRECTFD.SET\Style\USER02.STY";
FileInfo fi = new FileInfo(flPath);
myStream = fi.OpenRead();
Byte[] myBytes = new Byte[myStream.Length];
int i = myStream.Read(myBytes, 0, myBytes.Length);
string sText = System.Text.Encoding.UTF8.GetString(myBytes);
textBox1.Text = sText;
myStream.Close();

Jag kan öppna väldigt många filer nu, men inte det viktigaste, min sty-fil.
Tips vore väldigt tacksamt.

[REDIGERAT]
Denna kodsnutt fungerade på VB

Dim strRow As String 
Dim strText As String 
Dim sFil As String 

If Label1.Caption > "" Then 
   sFil = Label1.Caption 
   
     Open sFil For Binary As #1 
     
        strRow = string(LOF(1)," ")
      

        Get #1, , strRow  

     Close #1 

     strText = Replace(strRow, vbNullChar, "")
     Text1.Text = strText

Else 
   Label1.Caption = "Du måste välja en fil först" 
End If

.. men att översätta den...

Hexa.gif
PhorpherMedlem sedan feb. 20002 300 inlägg
#3

Förutsatt att det är en Yamahakeyboard du har så kanske PDF-filen här: http://www.wierzba.homepage.t-online.de/stylefiles.htm kan hjälpa?

sawMedlem sedan mars 20011 880 inlägg
#4

Nej jag har en Korg Pa1X

[Redigerat]
Nu börjar det röra på sig...

using (TextReader input = new StreamReader(new FileStream(flPath, FileMode.Open), System.Text.Encoding.Unicode))
            {
                String str = input.ReadToEnd();
                textBox1.Text = str;
            }

Då fick jag fram..
ᐁࠀ鑍᠀
Hur kan jag gå vidare med det?

PhorpherMedlem sedan feb. 20002 300 inlägg
#5

Du får försöka hitta en liknande guide som den jag länkade till (fast för Korg-keyboards istället.) Alternativt så mailar du till Korg och frågar om de har en specifikation på *.sty-formatet.

När du har en specifikation på hur filen är formaterad så får du skriva en parser som som kan läsa in rätt antal tecken till rätt datastruktur från filen.

sawMedlem sedan mars 20011 880 inlägg
#6

Jo jag skall göra detta, men det hjälper ju inte om jag inte kan se innehållet som i en hexeditor...

PhorpherMedlem sedan feb. 20002 300 inlägg
#7

Alltså. I en specifikation kommer det att stå någonting i stil med att filen startar med en header på 42 bytes där de åtta första är en kontrollsumma, nästa 12 bytes är namnet på style-filen, nästa sex är..., osv... Sen kanske innehållet kommer där ett visst antal bytes betyder vilket typ av instrument som avses, sen några bytes för reverb, några för ditt och några för datt.

Har du den informationen så vet du att om du läser in de första åtta från filen så kommer det att vara en kontrollsumma. Den kan du lagra undan och sen göra en motsvarande koll när hela filen är inläst att kontrollsumman stämmer. Nästa 12 bytes är ett namn (så rimligtvis en sträng). Läs in 12 bytes, stoppa i din namn-variabel och så har du namnet.

Jag vet inte om du blev så mycket klokare men det är ungefär den process som du måste gå igenom för att läsa in en fil.

sawMedlem sedan mars 20011 880 inlägg
#8

Hej och tack för din information.
Jo jag förstår hur du menar och det låter klokt. JAg återkommer.

sawMedlem sedan mars 20011 880 inlägg
#9

Mera problem

Jag har kontaktat Korg men de är tydligen inte villiga att släppa på
specifikationen ang sty -filerna.

Eftersom jag hadde svårt att läsa filerna, så fick jag iden att börja med en
HexaEditor. Nu kunde jag se vad filerna innehöll. Jag hittade en lösning här:
http://www.codeproject.com/KB/cs/HexEditor.aspx. Vad som är det första
problemet är att den är otroligt långsam, flera minuter för att läsa av en fil på
500-600 kb.
Några bra tips? :stud

sawMedlem sedan mars 20011 880 inlägg
#10

Jag har kommit en bit på vägen, och tänkte visa lite kod.

private void btnOpenFile_Click(object sender, EventArgs e)
        {
            path = txtFileName.Text + "\\" + listBox1.SelectedItem.ToString();
FileStream strm = new FileStream(path, FileMode.Open, FileAccess.Read);

            if (Data != null)
                Array.Clear(Data, 0, Data.Length);
            Data = new Byte[strm.Length];
            strm.Read(Data, 0, (int)strm.Length);
            strm.Close();
            FillTextBox();
}
private void FillTextBox()
        {
            txtNormal.Text = "";
            StringBuilder strb = new StringBuilder();
            StringBuilder text = new StringBuilder();
            char[] ch = new char[1];
            lblStatus.Text= "Status: Upptagen..." ;
            for (int x = 0; x < Data.Length; x += 16)
            {
                text.Length = 0;
                strb.Length = 0;
                for (int y = 0; y < 16; ++y)
                {
                    if ((x + y) > (Data.Length - 1))
                        break;
                    ch[0] = (char)Data[x + y];
                    strb.AppendFormat("{0,0:X2} ", (int)ch[0]);
                    if (((int)ch[0] < 32) || ((int)ch[0] > 127))
                        ch[0] = '.';
                    text.Append(ch);

                    Application.DoEvents();
                    
                }
                text.Append("\r\n");
                while (strb.Length < 52)
                    strb.Append(" ");
                strb.Append(text.ToString());
                txtNormal.Text += strb.ToString();
            } 
            txtNormal.Select(0, 0);
            lblStatus.Text = "Status: Klar...";
        }

Denna koden är väldig snabb, men den tycks inte stanna, det "flackar" hela
tiden i texboxen, som om den inte är färdig. Jag har låtit den rulla på ganska
så länge, men den gör likadant hela tiden. Detta gör att jag inte kan ställa mig
i textboxen för att kopiera t ex, då far muspekan direkt till början av textboxen.
Jag kan inte heller stänga av applikationen, den försvinner men enl debug
så är den igång hela tiden.
Jag stänger med

Application.Exit();

Förslag motages tacksamt.

136 ms totalt · 3 externa anrop · v20260731065814-full.29ac60f6
0 ms — hämta forumlista (cache)
0 ms — hämta statistik (cache)
134 ms — hämta tråd, inlägg och bilagor (db)