作者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