begin process at 2010 02 10 07:14:07
  Trouver un code source :
 
dans
 
Accueil > Forum > 

Archive C#

 > 

Archives

 > 

Multimédia

 > 

Equivalence c/c#


Derniers messages déposésPoser une question dans le forum ou lancer une discussion

Equivalence c/c#

jeudi 4 août 2005 à 13:52:26 | Equivalence c/c#

lezabour55

Membre Club
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....
Merci

jeudi 4 août 2005 à 14:32:33 | Re : Equivalence c/c#

Lutinore

Administrateur CodeS-SourceS
Salut, as tu pris en compte que les "char" en .NET sont sur 2 octets !?
jeudi 4 août 2005 à 18:02:49 | Re : Equivalence c/c#

lezabour55

Membre Club
y a aussi une embrouille avec les Int je sais...
Pourrais tu me conseiller un equivalent?
merci :)
vendredi 5 août 2005 à 08:52:12 | Re : Equivalence c/c#

SharpMao

Membre Club
Hello,

Lutinore a raison, les chars en .Net sont sur 2 bytes.

Plutôt que le ReadChars, utilise ReadBytes.

Amicalement, SharpMao
vendredi 5 août 2005 à 10:22:43 | Re : Equivalence c/c#

Chris_LaFouine

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)!!!

vendredi 5 août 2005 à 12:44:13 | Re : Equivalence c/c#

lezabour55

Membre Club
Ok j'ai suivi vos conseils, je vous rappel que je suis un debutant total en C# :)
Donc j'ai fais
string prefix;
prefix=(string)binReader.ReadBytes(4);

Il me dis "cannot convert bytes[] to string"
J'ai tenter la meme avec des Char[] prefix=new char[4];
mais il accepte pas le castage que je lui fais :(
Merci en tout cas pour votre aide

vendredi 5 août 2005 à 13:23:02 | Re : Equivalence c/c#

lezabour55

Membre Club
bon j'ai tenter ca, il est sur que ca aide :)
par contre je dois vraiment pas le maitriser car pour
fscanf( infile, "%4c", &nChunkSize );
fscanf( infile, "%8c", fileFormat );

j'ai fais :
nChunkSize=Convert.ToUInt32(binReader.ReadBytes(4));

for(int i=0;i<8;i++) {
fileFormat[i]=Convert.ToChar(binReader.ReadByte()); }

mais j'ai une erreur lors de lexcution du programme notemment a cause du Convert.ToUint32...
Ma question un %4c  tiens sur un Int16?Int32?  de meme pour %2c
Quand je fais
nChunkSize=Convert.ToUInt16(binReader.ReadBytes(4));   alors nchunksize=0...
bref je m en sort pas :(
merci
vendredi 5 août 2005 à 13:51:12 | Re : Equivalence c/c#

Chris_LaFouine

Pour le premier problème, essayes ça :
String prefix = binReader.ReadBytes(4).ToString();

Pour le deuxième problème :
Int16-->16 bits donc 2 octets
Int32-->32 bits donc 4 octets
%4c-->4 octets car 1c fait 1octet...

Je crois que tu as ta réponse...

Par contre, pour ce qui est du :
nChunkSize=Convert.ToUInt32(binReader.ReadBytes(4));
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!
vendredi 5 août 2005 à 14:14:27 | Re : Equivalence c/c#

SharpMao

Membre Club
Hello,

Pour les entiers, tu peux continuer à faire comme avant (ReadUIntXX).
Pour les String, essaie avec

System.Text.Encoding.Ascii.GetString(binReader.ReadBytes(4));
ou avec
System.Text.Encoding.UTF8.GetString(binReader.ReadBytes(4));


Amicalement, SharpMao
vendredi 5 août 2005 à 14:41:23 | Re : Equivalence c/c#

Lutinore

Administrateur CodeS-SourceS

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.


1 2 3

Cette discussion est classée dans : fscanf, infile, binreader, 4c, readuint32


Répondre à ce message

Sujets en rapport avec ce message

Suite et j'espere fin :) WAV->RAW [ par lezabour55 ] Salut a tous, Apres un petit sejour en vacances je me suis remis a bosser sur mon projet. Malgres les petites idees que j'avais, aucune ne ma permis Debutant C#... code c/c++ [ par lezabour55 ] Salut a tous je me suis mis il y a peu au c#, et je vais reutiliser certain code c/c++ en c# char v1[4]; char v2[8]; unsigned long v3; <


Nos sponsors


Sondage...

Comparez les prix

CalendriCode

Février 2010
LMMJVSD
1234567
891011121314
15161718192021
22232425262728

Consulter la suite du CalendriCode

 
Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils.
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés

Google Coop CodeS-SourceS Google Coop CodeS-SourceS
Temps d'éxécution de la page : 0,484 sec (3)

Nous contacter | Annoncer sur CodeS-SourceS | Mentions légales