| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 2462 人关注过本帖
标题:数据分析程序求指教
只看楼主 加入收藏
venus85
Rank: 6Rank: 6
等 级:侠之大者
帖 子:159
专家分:477
注 册:2010-11-27
结帖率:64.71%
收藏
已结贴  问题点数:100 回复次数:16 
数据分析程序求指教
问题背景:
有数据如下:
#md 0x200eb8c0 4 450
0x200eb8c0: 02681000 00000803 00000001 01200000    ...............
0x200eb8d0: 00000000 000feffd
02000000 23001000    ...............
0x200eb8e0: 01003000 000021ca 03000100 00102000    ...............
..
...
....
0x200ec9e8: 00013000 0020001a  ...............
问题:我要对上述数据进行处理,处理的对象是冒号后面的四组十六进制数
1.如何判断一行读完了?冒号前面的地址怎么处理?
我的想法是用循环做,但是没想到怎么判断一行读完了?
2.我需要将16进制数据先转换成二进制,在转换成十进制,这个怎么处理?
求大神不吝赐教!!!

搜索更多相关主题的帖子: 数据 问题 十六进制 如何 
2012-04-19 22:54
寒风中的细雨
Rank: 17Rank: 17Rank: 17Rank: 17Rank: 17
等 级:贵宾
威 望:66
帖 子:1710
专家分:8645
注 册:2009-9-15
收藏
得分:0 
程序代码:
#include <iostream>
#include <fstream>
#include <string>
#include <sstream>
using namespace std;

int main()
{
    ifstream in("test.txt");
    string nLine;
    stringstream ss;

    while (getline(in, nLine))
    {
        cout << nLine << endl;
        string::size_type ii = nLine.find(':');
        if (ii!=string::npos)
        {
            nLine.erase(ii, 1);
        }
        cout << nLine << endl;

        int i;
        ss << nLine;
        ss >> hex >> i; cout << i << " ";
        ss >> hex >> i; cout << i << " ";
        ss >> hex >> i; cout << i << " ";
        ss >> hex >> i; cout << i << " ";
        ss >> hex >> i; cout << i << endl << endl;
        ss.clear();
    }

    return 0;
}
2012-04-20 00:08
寒风中的细雨
Rank: 17Rank: 17Rank: 17Rank: 17Rank: 17
等 级:贵宾
威 望:66
帖 子:1710
专家分:8645
注 册:2009-9-15
收藏
得分:0 
程序代码:
0x200eb8c0: 02681000 00000803 00000001 01200000
0x200eb8d0: 00000000 000feffd 02000000 23001000
0x200eb8e0: 01003000 000021ca 03000100 00102000

注意字符的编码
2012-04-20 00:09
silent_world
Rank: 9Rank: 9Rank: 9
等 级:蜘蛛侠
威 望:1
帖 子:258
专家分:1138
注 册:2011-9-24
收藏
得分:0 
呵呵,一些文本处理方面的东东
需要注意16进制前面加0x即可。
2012-04-20 17:40
beyondyf
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
等 级:贵宾
威 望:103
帖 子:3282
专家分:12654
注 册:2008-1-21
收藏
得分:100 
我比较感兴趣的是这些数据是干什么用的?
#md 0x200eb8c0 4 450
这个文件头的意义大概是 #md 起始地址 字长 数据长度(单位是字长)

一段内存映射?

重剑无锋,大巧不工
2012-04-20 18:09
venus85
Rank: 6Rank: 6
等 级:侠之大者
帖 子:159
专家分:477
注 册:2010-11-27
收藏
得分:0 
回复 2楼 寒风中的细雨
非常感谢细雨的帮助,但是我C++不会,能说明一下C怎么实现吗?不求具体的程序,求思路!再次感谢细雨!
2012-04-20 18:34
venus85
Rank: 6Rank: 6
等 级:侠之大者
帖 子:159
专家分:477
注 册:2010-11-27
收藏
得分:0 
回复 5楼 beyondyf
#md 0x200eb8c0 4 450
0x200eb8c0: 02681000 00000803 00000001 01200000    ...............
0x200eb8d0: 00000000 000feffd 02000000 23001000    ...............
0x200eb8e0: 01003000 000021ca 03000100 00102000    ...............
..
...
....
0x200ec9e8: 00013000 0020001a  ...............
其实程序的最终目的是将上述数据转换成复数,并以表格的形式存储在另外一个文件中。
上面的数据一帧有112.5行,下一帧又是从#md 0x200eb8c0 4 450这个地址开始的,但是数据内容不一样。
具体需要进行如下处理:
0x200eb8c0: 02681000 00000803 00000001 01200000    ...............
0x200eb8d0: 00000000 000feffd 02000000 23001000    ...............
0x200eb8e0: 01003000 000021ca 03000100 00102000    ...............
这六组数据为一个单元:
02681000 00000803 00000001 01200000  
00000000 000feffd
02681000 00000803这两组数据里面又分成3组数据,从右到左每五位16进制数表示一个复数,最左边一位不用。
比如:第一组5位数:00803写成二进制0000 0000 1000 0000 0011 ,每10位二进制表示一个十进制数,最高位表示符号 表示成复数为:2+3i。
第二组五位数00 000 ,表示成0;
第三组五位数26810 ->0010 0110 1000 0001 0000表示成十进制复数:154+16i;
这就是这个程序的目的,不知道我说清楚没有,求指导,不求程序,求思路!谢谢

[ 本帖最后由 venus85 于 2012-4-20 18:59 编辑 ]
2012-04-20 18:57
beyondyf
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
等 级:贵宾
威 望:103
帖 子:3282
专家分:12654
注 册:2008-1-21
收藏
得分:0 
你说的很清楚。基本上明白怎么回事了。这段数据恐怕是通过某个软件截取出来的吧?包括后面的点号都是存在于输入文件里的是不是(那些点让我想起了debug)?

而你想要的只是每行中间的四个十六进制数,最后解析成675个复数另进存储。

如果像我上面所说那样的话,那你的输入数据格式应该是很严格的,也就是说每个数据所在的位置是很精确的。这就非常简单了,估计scanf("0x%x: %x %x %x %x %s",...)这句就够用了。

不要在数制上纠结。你需要注意的是在转换为复数时小心处理符号位,这里容易埋下BUG。

重剑无锋,大巧不工
2012-04-20 22:30
你们都要疼我哦
Rank: 11Rank: 11Rank: 11Rank: 11
来 自:火星
等 级:贵宾
威 望:49
帖 子:1296
专家分:2746
注 册:2008-7-13
收藏
得分:0 
UBoot命令呀。 取完整的一祯,从头开始读,判断是否是冒号的ASCII码值,是冒号码值 后面就是需要的东东,可以用循环控制读取的字数,如果觉得不保险,可以再继续读后面的几个字符判断是否是地址如0x200形式,这样就能准确的读一行。
除非你是有转储在磁盘上的这样的文件,才可以这样处理。如果是现场机上动态的显示,要么你转存后处理,要么就读取内存动态取值分析。

小妹,哥哥看你骨骼清奇,绝非凡人,将来必成大业,不如这样,你先把裤裤脱了,待哥哥为你开启灵窍,然后我们一起努力钻研如何
2012-04-21 06:30
venus85
Rank: 6Rank: 6
等 级:侠之大者
帖 子:159
专家分:477
注 册:2010-11-27
收藏
得分:0 
回复 8楼 beyondyf
大神,你太厉害了,这是抓取的天线角度数据,WCDMA里面的。根据你的思路我再好好想想,谢谢你哦!
输出格式确实是很严格啊,就是按照我说的那种格式,每一组数据都是那样的。而且每一个复数都是有编号的,
每个单元(6组16进制数)是编号从0到7的8组。

另外还有一个问题:我这个数据不能直接用printf输出的,
16进制变成10进制复数的过程是先变成2进制,5位16进制变成20位二进制,前10个二进制表示实部,后10个表示虚部,而且每10个2进制的最高位表示符号位
,这个没法直接用格式符输出的吧!(涉及到5位16进制中的第三位是要分成两部份的,一部分在实部,一部分在虚部)

而且数据本身像九楼说的是已近抓取出来的,存在一个文本上的,不是用scanf读入的!

[ 本帖最后由 venus85 于 2012-4-21 19:54 编辑 ]
2012-04-21 19:43
快速回复:数据分析程序求指教
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.067604 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved