| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 452 人关注过本帖
标题:16进制输出问题
只看楼主 加入收藏
lyl930130
Rank: 3Rank: 3
等 级:论坛游侠
帖 子:323
专家分:111
注 册:2013-5-13
结帖率:91.43%
收藏
已结贴  问题点数:20 回复次数:5 
16进制输出问题
读pcap包,查看读的数据包头和ip头,输出部分如下:
程序代码:
void print_f(char *a,int n)
{
    for(int i=0;i<n;i++)
        printf("%02x ",a[i]);
    printf("\n");

调用部分如下:
print_f((char *)ptk_header,16);
print_f((char *)ip_header,20);


输出结果:
00 00 00 00 00 00 00 00 ffffff98 00 00 00 ffffff98 00 00 00
45 00 00 ffffff98 00 00 40 00 3f 32 ffffffa3 ffffffe7 ffffffaf 64 01 1e ffffffc3 ffffffc8 23 02

1.不明白为什么会出现6个f
2.怎么才能把前面的f不输出
搜索更多相关主题的帖子: 包头 
2015-09-30 09:14
embed_xuel
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
等 级:贵宾
威 望:58
帖 子:3845
专家分:11385
注 册:2011-9-13
收藏
得分:10 
void print_f(char *a,int n) 改成
void print_f(unsigned char *a,int n)试试

总有那身价贱的人给作业贴回复完整的代码
2015-09-30 09:37
lyl930130
Rank: 3Rank: 3
等 级:论坛游侠
帖 子:323
专家分:111
注 册:2013-5-13
收藏
得分:0 
回复 2楼 embed_xuel
有用!谢谢!
想问一下为什么加个unsigned就好了
2015-09-30 09:40
rjsp
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:528
帖 子:9008
专家分:53957
注 册:2011-1-18
收藏
得分:10 
楼上可以解决问题,但最根本的错误原因不在这里,而是在 printf("%02x ",a[i]); 这一句。
C标准要求 o, u, x, X 后面接的是 unsigned int,而你给的却是 char。
C标准还说 d, i, o, u, x, X 后面要想接 signed char/unsigned char 的话,得加长度修饰 hh
因此,按标准你应该写成 printf("%02hhx ",a[i])。
(用VC的注意一下,低版本的VC只支持h,不支持hh。有用VC2013/VC2015的,可以试试看是不是支持了。看看 printf( "%hhx", '\xff' ); 是输出正确的ff,还是错误的ffff )

设计上也有大错,楼主可以看看 memset、memcpy 之类的函数,别人的参数类型是 void* / const void*,给你个示范吧:
程序代码:
#include <stdio.h>

void print_f( const void* src, size_t n )
{
    for( size_t i=0; i!=n; ++i )
        printf( "%02hhX ", ((const unsigned char*)src)[i] );
    printf( "\n" );
}

int main( void )
{
    const char* a = "\x98\x45";
    print_f( a, 2 );

    int b = 0x12345678;
    print_f( &b, sizeof(b) );

    return 0;
}

2015-09-30 10:01
rjsp
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:528
帖 子:9008
专家分:53957
注 册:2011-1-18
收藏
得分:0 
以下是引用lyl930130在2015-9-30 09:40:16的发言:

有用!谢谢!
想问一下为什么加个unsigned就好了

这个在C标准中叫 integer promotions
你的 char 被类型提升到int作为参数,然后又作为unsigned int被打印出来,反正就是一塌糊涂,你自己试试
char a = -1;
int b = a;
unsigned c = b;
你看看现在 c 等于多少?
2015-09-30 10:06
lyl930130
Rank: 3Rank: 3
等 级:论坛游侠
帖 子:323
专家分:111
注 册:2013-5-13
收藏
得分:0 
回复 4楼 rjsp
谢谢!!
2015-09-30 10:16
快速回复:16进制输出问题
数据加载中...
 
   



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

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