看板 C_and_CPP 關於我們 聯絡資訊
因為我要做的是資料處理 樣本有兩種, 一種是 8 bits per sample, 一種是 16 bits 以下是我的 code ifstream in(file_name,ios::binary); char c; int temp; int frequency[256]={0}; for(int i=0;i<file_length;i++){ temp=c; //強制將 char 放進 int 裡 temp=temp+128; frequency[temp]++; } 這程式是要統計各個值出現的次數 我原先使用了 int n=atoi(c); 發現並不能 work (不知道是 atoi 不能吃 char 型態還是???) 之後我發現 char 可以直接存進 int 裡 所以才寫了下半部的迴圈, 能正確統計出各個值出現的字數 這在處理 1 byte 的 sample 的時候還可以 但在處理 2 bytes 的 sample時 要怎麼才能將 2 bytes 的資料存入 int 內呢 ??? 我能想到的作法只有 先抓 1 byte 存入 int a 後 將 a 往左 shift 8 bits 之後再抓 1 byte 放入 int b 之後 a+b 再加上 2的15次方 (將所有值都轉為非負數) 可是這樣的作法好像太過麻煩~ 加上這樣的形態轉換問題其實還蠻常碰到的 想請教各位大大有沒有比較好的作法 , 謝謝^^! -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 220.133.199.90
Fenikso:unsigned short s; in.read((char*)&s, 2); 03/03 21:16
walker2009:想請問,原先我也有想到用unsign看是不是可以省去 +128 03/03 21:21
walker2009:可是這樣是否會有值錯亂的問題?? 03/03 21:21
walker2009:因為在 char 中原先 msb 是 1 的原本應該是 負值 03/03 21:22
walker2009:可是在存到 unsigned 後 似乎會變成正數,且比原先 msb 03/03 21:22
walker2009:是 0的還大 03/03 21:22
walker2009:感謝 F 大多次幫我解決困難XDDDD 03/03 21:24
Fenikso:會不會錯亂要看那個值對你的意義@@ 03/03 21:25
walker2009:嗯...因為我是想保持住原有的大小順序,之後才能轉回來 03/03 21:26
walker2009:這樣的話除了加上2的power之外, 還有好的做法嗎 @@ 03/03 21:27
Fenikso:如果只是要signed/unsigned互轉的話直接cast就好 03/03 21:30
Fenikso:結果會是一樣的.. 順序其實不重要 03/03 21:31
walker2009:這樣我了解了!!! 感謝 F大 ^^ 03/03 21:32
godman362:int n = atoi(c.str()); 試試看,我之前都是這樣處理 03/03 21:35
godman362:打錯,是int n = atoi(c.c_str()); 03/03 21:36
godman362:然後記得要include string.h 或是cstring 03/03 21:38
walker2009:馬上試試! 03/03 21:41
walker2009:god大我試了不成功耶Q_Q c_str 跟 str 都沒有宣告 03/03 21:45
walker2009:我有 include cstring 了, string.h 也試過 03/03 21:46
walker2009:不知道是不是 Dec C++ 的問題 03/03 21:46
godman362:沒啊....我都很正常啊 03/03 21:48
walker2009:可能是我的版本太舊了XDD 4.9.9.2 03/03 21:49
walker2009:還是說atoi一定要字串型態才能轉, char 不行0.0 03/03 21:50
walker2009:單抓一個 char 的話字尾沒有 \0 ~ 03/03 21:50
godman362:sorry,atoi(c.c_str()) 適用於string 03/03 21:53
godman362:沒注意到你的c是char型態 03/03 21:53
walker2009:XDDDD 感恩感恩 03/03 21:54
walker2009:只是每次處理圖片時要把 char 轉成 int 都讓我很頭痛 03/03 21:55
walker2009:今天學到不少 XDDD 03/03 21:55