kann man aus array=[10 20 11 11 30 40 ....] ein array=[1020 1111 3040 ...] machen?
-
Moin,
der Title ist eigendlich schon meine Frage.
hier nochmal etwas ausführlicher. ich versuche eine .wav datei einzulesen.
die wave datei sieht etwa so aus im hex editor.Wave:
"0f 02 0d dd 03 ...."ich lese also die datei aus und bekomme ein array
array(ist zustand) = [0f 02 0d dd 03 23....]
Problem ist nun aber, dass ich
folgende array form brauchearray(wunsch)= [0f02 0ddd 0323 ....]
also immer zwei array elemente sollen als eine zahl aufgefast werden. hat jemand einen plan wie das geht?
Im moment versuche ich das ganze über den umweg von strings zu realisieren.
mit concat aber bis jetzt bekomme ich das nicht hin... (sackgasse)?thx rico
---------------------------------------// wav_2_dsp.cpp : Defines the entry point for the console application.
//#include "stdafx.h"
int _tmain(int argc, _TCHAR* argv[])
{
FILE * fp1;
int sample;
int right_chanel [16];fp1 = fopen ("filtered_wav.wav","r+");
if (fp1==NULL) perror ("Error opening file\n");
else
{
// fseek setzt den pointer auf die 45 stelle das ist die erste stelle nach dem wav header
// to the first true Data
fseek (fp1, 44, SEEK_SET);// das vertauschen der Reihenfolge der Samplewerte ist nötig da der Wert 0x7fff heisst aber
// im wav format als ff 7f abgespeichert wird. glaube das heist little-endien oder so
// nun hab ich aber zwei einzelne array werte [ 7f ff ... ] die zu einem arraywert werden sollen
// nämlich zu [ 7fff ... ]; wie kann man einzelen array zahlen werte verketten??? oder muss man das
// über den umweg von strings machen???i=1;
sample = fgetc( fp1 );
cout<<" \n" << hex << sample;
right_chanel[i]= sample;sample = fgetc( fp1 );
cout<<" \n" << hex << sample;
right_chanel[i-1]= sample;}
return 0;
}
-
ROFLMAO
-
TGGC schrieb:
rico_del_sol schrieb:
ich lese also die datei aus und bekomme ein array
array(ist zustand) = [0f 02 0d dd 03 23....]
Problem ist nun aber, dass ich
folgende array form brauchearray(wunsch)= [0f02 0ddd 0323 ....]
Dann lies es halt so ein.
Bye, TGGC (Keine Macht den Dummen)
-
echt toll danke
-
rico_del_sol schrieb:
echt toll danke
Zeig mal wie du es lösen konntest.
-
...ich weiss es leider wirklich nicht ... ein paar leute hier scheinen aber zu meinen, dass das problem wohl so lächerlich einfach zu lösen ist das ich mich selbst drum kümmern muss. nach 5 std. erfolgloser suche im netz plus zig versuchen es mit umwegen hinzubekommen ein echter trost...
-
sar schrieb:
rico_del_sol schrieb:
echt toll danke
Zeig mal wie du es lösen konntest.
Kategorie: N-C
-
bitte habt erbarmen Ihr götter des codes ... mit mir ungläubigen unwissenden erleutet mich ... lasst euch herhab auf dieses unterste stufe und sag wie es gemacht wird
-
Ich denke, so sollte es gehen:
#include <fstream> #include <vector> int main() { std::vector<int> v; std::ifstream in("datei.txt"); char c; int i; do { i = 0; if(in.get(c)) { i |= int(c) << 8; if(in.get(c) i |= int(c); v.push_back(i); } } while(in); }
-
Wenn Du sie als ints einliest, dann kannste zwei so zusammenkleben:
unsigned int erg = 256*a + b;
-
super idee danke
thx for help
-
oohh
-
Ne andere möglichkeit ohne bitshifting:
#include <fstream> #include <vector> int main(){ std::vector<int> data; std::ifstream file("file.dat",std::ios::binary); file.seekg(0,std::ios::end); unsigned filesize = file.tellg(); file.seekg(0,std::ios::beg); unsigned loop_cnt = filesize / 2; for(unsigned i = 0; i < loop_cnt; ++i) { int temp = 0; file.read( reinterpret_cast<char*>(&temp) , 2 ); data.push_back(temp); } if(filesize % 2) { int temp = 0; temp = file.get(); data.push_back(temp); } }
-
Bei evilissimos Lösung kriegst du aber arge Probleme auf big endian-Maschinen.
-
Nach dem ich mir den Text von rico_del_sol noch mal durchgelesen hab ist mir aufgefallen das die byteorder der wave datei wohl auch anzupassen ist.
Das hab ich bei dem code da oben nicht beachtet, dazu kommt, das ich auch die endianess (Edit: des aktuellen systems )nicht beachtet hab, also ist der alte post n gutes beispiel für eine falsche versionMfG
-
okay,
nun ist es soweit das nächste für mich unlösbare problem ist da.
beim angefügte listing geht alles, bis in der wave datei ein eintrag mit "... 1A ...." auftaucht.
Jedesmal wenn im file die zahl 0x1A vorkommt schreibt das programm nur noch 0xff und zwar ab da nur 0xff in die outputdatei, anstatt auch 0x1A zu schreiben.Ziel war es erst einmal eine wav-datei stück für stück zu kopieren,
aus wav2dsp.wav in die datei dsp_filtered.wav.
wie gesagt wenn der wert 1A im wave auftaucht schmiert das proggi ab????
ich hab 1A mit 00 ersetzt und alles funktioniert wunderbar ?? was ist hier los bitte um hilfe.///////////////////////////////////////////////////////////////////////////////
FILE * fp_in;
FILE * fp_out;short sample;
short header_stuff;
int right_high, left_high;
int right_low, left_low;
unsigned int right_hex, left_hex;
int right[16];
int left[16];
int i, j, k;
long size_of_data = 4;//MAIN/////////////////////////////////////////////////////////////////////////////////////////
fp_in = fopen ("wav2dsp.wav","r");
fp_out= fopen ("dsp_filtered_wav.wav","w");if (fp_in==NULL || fp_out==NULL)
{(perror ("Error opening file\n"));}
else
{
//this reads out the size of the sound data
fseek (fp_in, 0, SEEK_END);
size_of_data = ftell( fp_in );//this copies the header from the input-wav.file to output-wav.file
fseek (fp_in, 0, SEEK_SET);
fseek (fp_out, 0, SEEK_SET);
cout<<"\nHeader of the Wavefile :\n"<< endl;
for (j=0; j <size_of_data+1 ; j++)
{
header_stuff = fgetc( fp_in );
if (header_stuff == 1A) (header_stuff= 1A)
putc(header_stuff ,fp_out);
}
}return 0;
-
Bitte Code-Tags verwenden
[cpp]
if (header_stuff == 0x1A) (header_stuff= 0x1A)
putc(header_stuff ,fp_out);
}
[/cpp]Wie sieht es hiermit aus?
EDIT: Bzw, was hat es eigentlich mit dem Konstrukt hinter dem if auf sich
Ist das so gemeint?for (j=0; j <size_of_data+1 ; j++) { header_stuff = fgetc( fp_in ); if (header_stuff == 0x1A) { header_stuff= 0x1A; } putc(header_stuff ,fp_out); }
-
habs im netz gefunden.
also fopen denkt es würde die datei im text mode öfnen man muss explizit
fopen (... "rb") für binary benutzten dann geht alles ohne probl.das komische konstrukt nach dem if hab ich aus versehen noch nicht gelöscht gehabt es stammte ncoh von einem versuch das ganze zu umgehen.
thx for ur help
-
OK,
if (header_stuff == 0x1A) { header_stuff= 0x1A; }
...hätte ja auch nicht viel Sinn gemacht