作者walker2009 (誰人未嘗自以為)
看板C_and_CPP
標題[問題] 請問如何將 非int型態資料 轉成 int ??
時間Tue Mar 3 21:13:08 2009
因為我要做的是資料處理
樣本有兩種, 一種是 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
1F:推 Fenikso:unsigned short s; in.read((char*)&s, 2); 03/03 21:16
2F:→ walker2009:想請問,原先我也有想到用unsign看是不是可以省去 +128 03/03 21:21
3F:→ walker2009:可是這樣是否會有值錯亂的問題?? 03/03 21:21
4F:→ walker2009:因為在 char 中原先 msb 是 1 的原本應該是 負值 03/03 21:22
5F:→ walker2009:可是在存到 unsigned 後 似乎會變成正數,且比原先 msb 03/03 21:22
6F:→ walker2009:是 0的還大 03/03 21:22
7F:→ walker2009:感謝 F 大多次幫我解決困難XDDDD 03/03 21:24
8F:推 Fenikso:會不會錯亂要看那個值對你的意義@@ 03/03 21:25
9F:→ walker2009:嗯...因為我是想保持住原有的大小順序,之後才能轉回來 03/03 21:26
10F:→ walker2009:這樣的話除了加上2的power之外, 還有好的做法嗎 @@ 03/03 21:27
11F:推 Fenikso:如果只是要signed/unsigned互轉的話直接cast就好 03/03 21:30
12F:→ Fenikso:結果會是一樣的.. 順序其實不重要 03/03 21:31
13F:→ walker2009:這樣我了解了!!! 感謝 F大 ^^ 03/03 21:32
14F:推 godman362:int n = atoi(c.str()); 試試看,我之前都是這樣處理 03/03 21:35
15F:→ godman362:打錯,是int n = atoi(c.c_str()); 03/03 21:36
16F:→ godman362:然後記得要include string.h 或是cstring 03/03 21:38
17F:→ walker2009:馬上試試! 03/03 21:41
18F:→ walker2009:god大我試了不成功耶Q_Q c_str 跟 str 都沒有宣告 03/03 21:45
19F:→ walker2009:我有 include cstring 了, string.h 也試過 03/03 21:46
20F:→ walker2009:不知道是不是 Dec C++ 的問題 03/03 21:46
21F:推 godman362:沒啊....我都很正常啊 03/03 21:48
22F:→ walker2009:可能是我的版本太舊了XDD 4.9.9.2 03/03 21:49
23F:→ walker2009:還是說atoi一定要字串型態才能轉, char 不行0.0 03/03 21:50
24F:→ walker2009:單抓一個 char 的話字尾沒有 \0 ~ 03/03 21:50
25F:推 godman362:sorry,atoi(c.c_str()) 適用於string 03/03 21:53
26F:→ godman362:沒注意到你的c是char型態 03/03 21:53
27F:→ walker2009:XDDDD 感恩感恩 03/03 21:54
28F:→ walker2009:只是每次處理圖片時要把 char 轉成 int 都讓我很頭痛 03/03 21:55
29F:→ walker2009:今天學到不少 XDDD 03/03 21:55