lezabour55
Messages postés22Date d'inscriptionmercredi 27 octobre 2004StatutMembreDernière intervention18 juillet 2006
-
4 août 2005 à 13:52
lezabour55
Messages postés22Date d'inscriptionmercredi 27 octobre 2004StatutMembreDernière intervention18 juillet 2006
-
6 août 2005 à 14:27
Salut a tous,
Toujours dans ma recherche de transformation de prog C en C#, je
cherche a verifier la parfaite equivalence entre mon morceau de code C
et celui en C#.
Les resultats que j'obtiens sont quasi les memes mais pas exactement,
ce qui me fais dire que mon prog C# n'est pas encore bon...
Tout aide serait la bienvenue :)
EN C cela donne:
fscanf( infile, "%4c", prefix );
fscanf( infile, "%4c", &nChunkSize );
fscanf( infile, "%8c", fileFormat );
fscanf( infile, "%4c", &nChunkSize );
fscanf( infile, "%2c", &wFormatTag );
fscanf( infile, "%2c", &nChannels );
fscanf( infile, "%4c", &nSamplesPerSecond );
fscanf( infile, "%4c", &nAvgBytesPerSecond );
fscanf( infile, "%2c", &nBlockAlign );
fscanf( infile, "%2c", &nBitsPerSample );
fscanf( infile, "%4s", &ckID );
fscanf( infile, "%4c", &nChunkSize );
for( i = 0; (i < nChunkSize);i++ ) {
fscanf( infile, "%1c", &ch );
byteValue = ((float)ch-128)/128;
fprintf(outfile,"%g\n",byteValue);
L Equivalent(??) en C#
BinaryReader binReader = new BinaryReader(File.Open(fileName, FileMode.Open));
if(binReader.PeekChar() != -1)
{
prefix=binReader.ReadChars(4);
nChunkSize = binReader.ReadUInt32();
fileFormat = binReader.ReadChars(8);
nChunkSize2 = binReader.ReadUInt32();
wFormatTag = binReader.ReadUInt16();
nChannels = binReader.ReadUInt16();
nSamplesPerSecond = binReader.ReadUInt32();
nAvgBytesPerSecond = binReader.ReadUInt32();
nBlockAlign = binReader.ReadInt16();
nBitsPerSample = binReader.ReadInt16();
ckID = binReader.ReadChars(4);
nChunkSize3 = binReader.ReadUInt32();
}
StreamWriter monStreamWriter = new StreamWriter(fileName2);
char ch;
for(int i=0;i<nChunkSize;i++) {
ch=binReader.ReadChar();
byteValue = ((float)ch-128)/128;
monStreamWriter.WriteLine(byteValue);
Console.WriteLine("i:"+i);
}
binReader.Close();
monStreamWriter.Close();
Voila en gros ca lis les header dans mon fichier (Wav) et ca ecrit apres les frquences dans un fichiers RAW.
VOila les valeurs des variables n'est pas les memes entre les 2 programmes, de meme que le fichier RAW de sortie....
A mon avis le probleme viens de mes BinaryReader, avec les Int16-Int32....
Chris_LaFouine
Messages postés109Date d'inscriptionmardi 13 avril 2004StatutMembreDernière intervention 4 juin 2008 5 août 2005 à 10:22
Ouais, c'est clair... j'avais bien entamé des classes pour lire les
Tags ID3 v1 et v2 de MP3 et au début, je faisais carrément
ReadString... j'ai compris ma douleur quand je suis tombé sur des
Chr(0)!!!
Ouais, comme le dit SharpMao, utilise ReadBytes... Et après, tu
convertis en dans le format voulu... c'est plus efficace... et
d'ailleurs, c'est que je fais pour virer les octets à 0... parce que ça
merde dès que tu le convertis en String (ou en Char)!!!
Vous n’avez pas trouvé la réponse que vous recherchez ?
C'est normal que ça fonctionne pas. Si tu regardes les prototypes de
Convert.ToUInt32, tu verras qu'il y a en pas qui prennent en compte un
tableau de Bytes. Si je comprends bien, ce que tu veux faire c'est que
si ton binReader.ReadBytes(4) contient :
1 (01 en hexa)
30 (1E en hexa)
68 (44 en hexa)
7 (07 en hexa)
tu veux mettre la valeur numérique de 011E4407 (hexa) dans ta variable Int32 ce qui fait : 18760711 (en décimal).
Dis moi si je me trompe!
Si je suis sur la bonne voie, je crois que tu as gagné le droit de te faire ta propre fonction!
Lutinore
Messages postés3246Date d'inscriptionlundi 25 avril 2005StatutMembreDernière intervention27 octobre 201241 5 août 2005 à 14:41
Le constructeur de la classe BinaryReader accepte un paramètre "encoding", par défaut c'est sûrement du UTF8, comme SharpMao je pense qu'avec un encodeur ASCII ca devrait lire les chars sur un octet.
lezabour55
Messages postés22Date d'inscriptionmercredi 27 octobre 2004StatutMembreDernière intervention18 juillet 2006 5 août 2005 à 15:19
bon deja merci a tous pour vos reponses :)
J'explique j'essai de lire le header d'un fichier WAV afin de le tranformer en fichier RAW.
Pour ce faire j'ai repris un code source (en C) libre de droits,
et je m'en inspire pour faire mon petit programme a moi en C#.
Pour le prefix j'ai reussi a resoudre en utilisant effectivement le toString.
Par contre Chris, je ne sais pas du tout le resultat que je veux avoir, dans mes int.
1 (01 en hexa)
30 (1E en hexa)
68 (44 en hexa)
7 (07 en hexa)
tu veux mettre la valeur numérique de 011E4407 (hexa) dans ta variable Int32 ce qui fait : 18760711 (en décimal).
Aucun idee si cela correspond concretement a ce que je veux.
Je sais simplement que je veux transformer
fscanf( infile, "%4c", &nChunkSize ); en C#.
Ce qui signifie recuperer les 4 bytes et les mettres dans un Int. Chose
qui parait simple en C mais pas en C# lol Donc normalement comme c'est
4c->Int32
Bon par contre en ce qui concerne UTF8 ( enclair les 3 derniers msg 0 j'ai aps trop compris lol
MERCI A TOUS je vais continuer et essayer de voir :)
Chris_LaFouine
Messages postés109Date d'inscriptionmardi 13 avril 2004StatutMembreDernière intervention 4 juin 2008 5 août 2005 à 15:40
Fait un "monStreamWriter.Flush()" pour forcer l'écriture.
Sinon, en ce qui concerne le probleme Int32 et %4c, y a un truc que je comprends pas...
Pourquoi tu veux mettre 4 Bytes dans 1 Int32... c'est pas logique. T'as déjà essayé de faire loger 4 personnes dans 1 chiotte? C'est pas normal! (Désolé pour l'exemple, mais c'est le premier qui me vient à l'esprit ).
Si tu veux récupérer 4 Bytes pour les mettre dans un tableau de 4 Int16 (ou 32), c'est pas compliqué :
Mais si tu veux que la suite des 4 Bytes que tu as récupéré en lisant dans le fichier soit interprété comme 1 Int32, c'est un peu plus tendu et c'est là où tu devras faire une fonction!
lezabour55
Messages postés22Date d'inscriptionmercredi 27 octobre 2004StatutMembreDernière intervention18 juillet 2006 5 août 2005 à 15:45
alors le flush je le fais quand? juste apres avoir creer le SteamWriter?
Sinon en fait ca devrai etre je recupere les 4 bytes qui sront interpreter comme un Int32...
C'est ce que j'ai compris de mes lecture sur les entetes des fichiers
WAV, et c'est que dis le programme en C que j'ai donner a l'origine du
post fscanf( infile, "%4c", &nChunkSize ); je veux reellement transformer cela en C# donc a priori 4 bites dans un Int....
Donc a priori ca doit etre ca...
Je pense donc avoir a faire une fonction pour cela...