免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 4456 | 回复: 9
打印 上一主题 下一主题

sscanf问题 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2010-12-10 12:05 |只看该作者 |倒序浏览
环境AIX 编译器CC
int main()
{
        char s_pin_data[]="123456";
        char a[3];

        sscanf( s_pin_data, "%2x%2x%2x", &a[0], &a[1], &a[2] );
        printf( "\n a0=[%2x],a1=[%2x],a2=[%2x] \n", a[0], a[1], a[2] );

        return 1;
}


运行结果:
a0=[ 0],a1=[ 0],a2=[ 0]

环境xp 编译器vc6.0
a0=[12],a1=[34],a2=[56]

论坛徽章:
0
2 [报告]
发表于 2010-12-10 12:33 |只看该作者
scanf 中%x应该是32位int类型,而你用a数组是char类型。感觉赋值的时候值会覆盖。

论坛徽章:
0
3 [报告]
发表于 2010-12-10 12:38 |只看该作者
LS说对了一点 但不全是 因为就算如此 那windows也会覆盖

更重要的一点是字节序的差异:windows是小端 而Aix是大端

论坛徽章:
1
CU十二周年纪念徽章
日期:2013-10-24 15:41:34
4 [报告]
发表于 2010-12-10 12:41 |只看该作者
LS说对了一点 但不全是 因为就算如此 那windows也会覆盖

更重要的一点是字节序的差异:windows是小端 而 ...
lenky0401 发表于 2010-12-10 12:38



    小端和大端不是针对OS来说的吧,是对架构(cpu)来说的吧。

论坛徽章:
0
5 [报告]
发表于 2010-12-10 12:44 |只看该作者
本帖最后由 north423 于 2010-12-10 13:04 编辑

使用单字节拷贝%hhx

例子是拷贝mac地址,linux下环境
  1. unsigned char mac0,mac1,mac2,mac3,mac4,mac5;
  2. sscanf(argv[1],"%hhx:%hhx:%hhx:%hhx:%hhx:%hhx\n",&mac0,&mac1,&mac2,&mac3,&mac4,&mac5);
  3. printf("%x %x %x %x %x %x %s\n",mac0,mac1,mac2,mac3,mac4,mac5,argv[1]);
复制代码
/*使用楼主的方式,如下面的方法*/
  1. #include <stdio.h>
  2. #include <signal.h>

  3. int main()
  4. {
  5.         char s_pin_data[]="123456";
  6.         char a[3];

  7.         sscanf( s_pin_data, "%2hhx%2hhx%2hhx", &a[0], &a[1], &a[2] );
  8.         printf( "\n a0=[%2x],a1=[%2x],a2=[%2x] \n", a[0], a[1], a[2] );

  9.         return 1;
  10. }
复制代码
结果(big-endian架构)
  1. sh-2.04# ./a.out

  2. a0=[12],a1=[34],a2=[56]
复制代码

论坛徽章:
0
6 [报告]
发表于 2010-12-10 12:47 |只看该作者
感觉是不还和sscanf函数中a[0],a[1],a[2]的赋值顺序有关。

论坛徽章:
0
7 [报告]
发表于 2010-12-10 12:49 |只看该作者
是的 但是一般从操作系统类型基本可以看出它的大小端类型

比如 AIX基本都POWER架构上 而WINDOWS常装在X86架构上

论坛徽章:
0
8 [报告]
发表于 2010-12-10 12:52 |只看该作者
LZ把char a[3];换成int a[3];再在AIX上试试结果呢?

论坛徽章:
0
9 [报告]
发表于 2010-12-10 14:05 |只看该作者
在这位大虾的帮助下,解决了此问题,用 north423  的%hhx方法。

对于大端小端问题,用这种方法就可以看到。
        int i = 0x0001;
        if( *(char*)&i == 0x01 )
        {
                printf( "\n little!!! \n" );
        }
        else
        {
                printf( "\n big!!! \n" );
        }
的确aix是大端,X86是小端。
说明一下,我在x86的机器上用vmware虚拟的sco,发现也是小端,因为是x86的cpu是吧~

论坛徽章:
0
10 [报告]
发表于 2010-12-10 15:33 |只看该作者
楼上的都很牛啊,顶之
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP