Newsgroup: it.comp.lang.visual-basic
Titolo: 0x00 0x2f 0xff

Come faccio a scrive quelle cose in un file binario?
Se ad esempio voglio scrivere 0x2f come devo fare?
Grazie

 Se ad esempio voglio scrivere 0x2f come devo fare?
intendi come stringa "0x2f" oppure come numero 47?
put #1, , "0x2f"     ' per scrivere il testo "0x2f"
put #1, , &H2F     ' per scrivere il numero 47 (2f hex)
put #1, , chr(&H2f) ' per scrivere il carattere ascii 47
ovviamente il file #1 deve essere aperto con open e chiuso
con close
--
Fibia "Sakamoto" FBI
E-mail: 
fibi...@hotmail.com
ICQ UIN 63586057
Sito Personale: 
http://www.geocities.com/fibiafbi
VB Simple: 
http://vbsimple.virtualave.net
Membro #25 delle Mitiche Brigate Takahashi sezione Sud


Ti avevo gia' risposto, probabilmente non hai visto il mio msg.
Dim filenumber As Integer
filenumber = FreeFile
Open "C:\pippo.bin" For Binary Access Write As filenumber
Put filenumber, , &HFF
Put filenumber, , &H2F
Put filenumber, , &H0
Close filenumber
Questa e' la "traduzione" dal codice C che avevi postato.
Se invece volevi ottenere un risultato diverso (ma mi pare che tu
volessi solo "tradurre" quel codice) chiedi pure, ma devi essere un
po' piu' preciso.
Ciao.

 wrote in message
9i7e5t$ggcg7$1...@ID-66902.news.dfncis.de...


> Ti avevo gia' risposto, probabilmente non hai visto il mio msg.
Scusa hai perfettamente ragione...grazie ancora!
Scusa pure se ho risposto all'altro messaggio senza leggere il tuo e
chiedendo quindi quello che mi hai detto tu!
Ciao

 po' piu' preciso.
Riporto in VB questo pezzetto di codice C++ che crea un file midi , ma
quando lo vado ad aprire col lettore multimediale di Windows mi dice che il
formato non è valido, dove sbaglio?
Il mio codice è :
intfile = FreeFile
vettnote(1) = 60
vettnote(2) = 62
vettnote(3) = 64
Open "c:\windows\desktop\pippo.mid" For Binary Access Write As #intfile
Put #intfile, , CByte(M)
Put #intfile, , CByte(T)
Put #intfile, , CByte(h)
Put #intfile, , CByte(d)
Put #intfile, , CByte(0)
Put #intfile, , CByte(0)
Put #intfile, , CByte(0)
Put #intfile, , CByte(6)
'//dati dell'header - formato file midi
Put #intfile, , CByte(0)
Put #intfile, , CByte(1)
'//numero tracce
Put #intfile, , CByte(0)
Put #intfile, , CByte(1)
'//ticks - divisione
 Put #intfile, , CByte(0)
 Put #intfile, , CByte(4)
     Dim resto As Integer, numbyte As Integer
  numbyte = 3 + 3 * 8 + 4 ';//strum + nnote * byte/nota + chiusura
  Put #intfile, , CByte(M)
  Put #intfile, , CByte(T)
  Put #intfile, , CByte(r)
  Put #intfile, , CByte(k)
  Put #intfile, , CByte((numbyte / 256 / 256 / 256))
  resto = numbyte Mod (16777216)
  Put #intfile, , CByte(resto Mod (65536))
  resto = resto Mod (65536)
  Put #intfile, , CByte(resto / 256)
  resto = resto Mod 256
  Put #intfile, , CByte(resto)
  Put #intfile, , CByte(0)
  Put #intfile, , CByte((12 * 16) + 1)
  Put #intfile, , CByte(1)
  For i = 1 To 3
  Put #intfile, , CByte(0)
  Put #intfile, , CByte((9 * 16) + 1)
  Put #intfile, , CByte(vettnote(i))
  Put #intfile, , CByte(60)
  Put #intfile, , CByte(4)
  Put #intfile, , CByte(8 * 16 + 1)
  Put #intfile, , CByte(vettnote(i))
  Put #intfile, , CByte(60)
   Next i
   ' chiusura
  Put #intfile, , CByte(&H0)
   Put #intfile, , CByte(&HFF)
   Put #intfile, , CByte(&H2F)
   Put #intfile, , CByte(&H0)
   'Put #intfile, , CByte(0)
    Close #intfile
MENTRE QUELLO IN C++ E'
pippo=fopen(nomeFile,"w");
 if (!pippo)
  return false;
 /*======================
 CHUNCK INTESTAZIONE FILE
 ========================*/
 fputs("MThd",pippo);//intest del chunck
 // lungh del ch
 fputc(0,pippo);
 fputc(0,pippo);
 fputc(0,pippo);
 fputc(6,pippo);
 //dati dell'header - formato file midi
 fputc(0,pippo);
 fputc(1,pippo);//formato 1
 //numero tracce
 fputc(0,pippo);
 fputc(ATTUALEnumCanali,pippo);//aggiunta traccia tempo
 //ticks - divisione
 fputc(0,pippo);
 fputc(4,pippo);//moltiplicatore per 4 del denominatore
 /*=====================
     CHUNCK DEI DATI
 =======================*/
 for(int passi=0;passi<ATTUALEnumCanali;passi++)
 {
  int resto;
  int numByte = 3 + canali[passi].numNote * 8 + 4;//strum + nnote *
byte/nota + chiusura
  fputs("MTrk",pippo);
 //lungh
  fputc(numByte/(256*256*256),pippo);
  resto=numByte%(256*256*256);
  fputc(resto/(256*256),pippo);
  resto=resto%(256*256);
  fputc(resto/256,pippo);
  resto=resto%256;
  fputc(resto,pippo);
 //STRUMENTO
  fputc(0,pippo);//DELTA-TIME
  fputc((12*16)+passi,pippo);
  fputc(canali[passi].strumento,pippo);
  for(int pp=0;pp<canali[passi].numNote;pp++)
   if(canali[passi].arrayNote[pp].iNote!=-1)
   {
    fputc(0,pippo);//DELTA TIME
    fputc(9*16+passi,pippo);
    fputc(canali[passi].arrayNote[pp].iNote,pippo);
    fputc(127,pippo);//ampiezza
    fputc(canali[passi].arrayNote[pp].iDur/110,pippo);//DELTA TIME
    fputc(8*16+passi,pippo);
    fputc(canali[passi].arrayNote[pp].iNote,pippo);
    fputc(127,pippo);
   }
   else
   {
    fputc(0,pippo);//DELTA TIME
    fputc(9*16+passi,pippo);
    fputc(69,pippo);
    fputc(0,pippo);//ampiezza
    fputc(canali[passi].arrayNote[pp].iDur/110,pippo);//DELTA TIME
    fputc(8*16+passi,pippo);
    fputc(69,pippo);
    fputc(0,pippo);
   }
  }
 //CHIUSURA
  fputc(0,pippo);
  fputc(0xff,pippo);
  fputc(0x2f,pippo);
  fputc(0x00,pippo);
 }
 fclose(pippo);
 return true;
}

MENTRE QUELLO IN C++ E'
[snip]
La dichiarazione delle variabili non si usa piu' ?
Ci sara' qualche .h da includere, suppongo (ma e' c++ o c ?)
Mi riferisco a pippo, canali, ecc.
ciao, hal

 formato non è valido, dove sbaglio?
H.P.L. grazie ;-)
Ecco la corretta "traduzione" del codice, con un po' di intuizione
perche' mi mancavano alcuni dati come la struttura "nota" e
"canale":
Private Type note
    iDur As Integer
    iNote As Integer
End Type
Private Type canale
    numNote As Integer
    strumento As Integer
    arrayNote() As note
End Type
Dim intfile As Integer
    Dim ATTUALEnumCanali As Integer
    Dim canali() As canale
    ATTUALEnumCanali = 1
    ReDim canali(ATTUALEnumCanali - 1)
    ReDim canali(0).arrayNote(2)
    canali(0).numNote = 3
    canali(0).strumento = 1
    canali(0).arrayNote(0).iDur = 440
    canali(0).arrayNote(0).iNote = 60
    canali(0).arrayNote(1).iDur = 440
    canali(0).arrayNote(1).iNote = 62
    canali(0).arrayNote(2).iDur = 440
    canali(0).arrayNote(2).iNote = 64
    Dim i As Integer
    intfile = FreeFile
    Open "c:\pippo.mid" For Binary Access Write As #intfile
    Put #intfile, , "MThd"
    Put #intfile, , CByte(0)
    Put #intfile, , CByte(0)
    Put #intfile, , CByte(0)
    Put #intfile, , CByte(6)
    '//dati dell'header - formato file midi
    Put #intfile, , CByte(0)
    Put #intfile, , CByte(1)
    '//numero tracce
    Put #intfile, , CByte(0)
    Put #intfile, , CByte(ATTUALEnumCanali)
    '//ticks - divisione
    Put #intfile, , CByte(0)
    Put #intfile, , CByte(4)
    Dim passi As Integer
    For passi = 0 To ATTUALEnumCanali - 1
        Dim resto As Integer, numbyte As Integer
        numbyte = 3 + canali(passi).numNote * 8 + 4 ';//strum +
nnote * byte/nota + chiusura
        Put #intfile, , "MTrk"
        Put #intfile, , CByte((numbyte / 256 / 256 / 256))
        resto = numbyte Mod (16777216)
        Put #intfile, , CByte(resto / (65536))
        resto = resto Mod (65536)
        Put #intfile, , CByte(resto / 256)
        resto = resto Mod 256
        Put #intfile, , CByte(resto)
        'strumento
        Put #intfile, , CByte(0)
        Put #intfile, , CByte((12 * 16) + passi)
        Put #intfile, , CByte(canali(passi).strumento)
        Dim pp As Integer
        For pp = 0 To canali(passi).numNote - 1
            If (canali(passi).arrayNote(pp).iNote <> -1) Then
                Put #intfile, , CByte(0)
                Put #intfile, , CByte((9 * 16) + passi)
                Put #intfile, ,
CByte(canali(passi).arrayNote(pp).iNote)
                Put #intfile, , CByte(127)
                Put #intfile, ,
CByte(canali(passi).arrayNote(pp).iDur / 110)
                Put #intfile, , CByte((8 * 16) + passi)
                Put #intfile, ,
CByte(canali(passi).arrayNote(pp).iNote)
                Put #intfile, , CByte(127)
            Else
                Put #intfile, , CByte(0)
                Put #intfile, , CByte((9 * 16) + passi)
                Put #intfile, , CByte(69)
                Put #intfile, , CByte(0)
                Put #intfile, ,
CByte(canali(passi).arrayNote(pp).iDur / 110)
                Put #intfile, , CByte((8 * 16) + passi)
                Put #intfile, , CByte(69)
                Put #intfile, , CByte(0)
            End If
        Next
    Next
    ' chiusura
    Put #intfile, , CByte(&H0)
    Put #intfile, , CByte(&HFF)
    Put #intfile, , CByte(&H2F)
    Put #intfile, , CByte(&H0)
    Close #intfile
Ciao.

 (ma e' c++ o c ?)
Che sia C++ e non C lo capisci solo da:
for(int passi=0;passi<ATTUALEnumCanali;passi++)
che in C non e' corretto, poi, per il resto e' puro e semplice C.
Ciao.

Ciao.
grazie, hal

Grazie mille!
Tutto OK!
Ciao
H.P.L. <u...@vaila.ble> wrote in message
XcW17.11166$eB4.4...@news.infostrada.it...


che in C non e' corretto, poi, per il resto e' puro e semplice C.
perchè non è corretto? per la dichiarazione inline di passi?
-- 
Posted from 
mx1.aruba.it
 [62.149.128.130] 
via Mailgate.ORG Server - 
http://www.Mailgate.ORG

 perchè non è corretto? per la dichiarazione inline di passi?
hmm.. questa mi giunge nuova
in C non è possibile dichiarare la variabile?
se non ricordo male l'ho studiata proprio ad un corso di C anni fa


 passi?
Il C richiede che tutte le variabili siano dichiarate all'inizio della
funzione, prima di ogni altra istruzione, mentre in C++ puoi dichiararle
dove ti pare, ed inoltre lo scopo e' locale al blocco (in questo caso passi
e' visibile solo all'interno del ciclo for.
Ciao.

 in C non č possibile dichiarare la variabile?
In C sarebbe stato:
int passi;
... /* codice */
for(passi=0;passi<ATTUALEnumCanali;passi++)
... /*codice */
Ciao.