免费注册 查看新帖 |

Chinaunix

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

[C] 把192转化为\xc0形式 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2009-04-01 12:53 |只看该作者 |倒序浏览
如题所示 其中转换为\x为转义字符 占一个字节 换句话\xc0占用一个字节

论坛徽章:
0
2 [报告]
发表于 2009-04-01 13:14 |只看该作者
byte b = 192;

b就是占一个字节嘛,\xc0只不过是你人为地按十六进制去解释这个字节而已,反正机器只懂二进制

你要是想得到\xc0这样的表示,那就是四个字节的字符串了,不包括结尾的'\0'

printf("\\x%02x", 192)可以打印出 \xc0

论坛徽章:
0
3 [报告]
发表于 2009-04-01 13:33 |只看该作者
原帖由 雨过白鹭洲 于 2009-4-1 13:14 发表
byte b = 192;

b就是占一个字节嘛,\xc0只不过是你人为地按十六进制去解释这个字节而已,反正机器只懂二进制

你要是想得到\xc0这样的表示,那就是四个字节的字符串了,不包括结尾的'\0'

printf("\\x%0 ...

我不仅要得到\xc0这种形式,而且需要*(unsigned int*)("\xc0\xa8\x0\x1")这样的值,为了比较判断只用。把程序贴出来,大家看看。
#include <stdio.h>

int main(int argc, char **argv)
{
        int i = 0;
        unsigned char buffer[] = "192.168.0.1";
        unsigned char* drop_ip = "\xc0\xa8\x0\x1";
        char *p[4];
        char *buff = buffer;
        while((p = strtok(buff, ".")) != NULL)
        {
                i++;
                buff = NULL;
        }
        i = 0;
        while(i < 4)
        {
                printf("%s\n",p);
                i++;
        }
        int temp = 0;
        i = 0;
        unsigned char str[12] = "";
        unsigned char result[12] = "";
        while(i < 4)
        {
                temp = atoi(p);
                sprintf(str,"%s%X","\\x",temp);
                printf("i:%d str:%s\n",i, str);
                sprintf(result,"%s%s",result,str);
                printf("i:%d result:%s\n",i, result);
                i++;
        }
        printf("result:%d\n",*(unsigned int*)result);
        printf("drop_ip:%d\n",*(unsigned int*)drop_ip);
        return 0;
}
打印信息:
result:\xc0\xa8\x0\x1
result:809728092
drop_ip:16820416

这里result和drop_ip提示后的数字不一样,我要得到*(unsigned int*)result 和*(unsigned int*)drop_ip结果一样 改怎么办

[ 本帖最后由 wxj120bw 于 2009-4-1 13:35 编辑 ]

论坛徽章:
0
4 [报告]
发表于 2009-04-01 14:00 |只看该作者
我再说明下,任务是unsigned char*类型“192.168.0.1”转换得到unsigned int类型16820416。我的方法:把字符串“192.168.0.1”转为为result =“\xc0\xa8\x0\x1”,但*(unsinged int*)result不等于16820416。自己定义unsigned char* drop = "\xc0\xa8\x0\x1",其*(unsigned int*)drop结果等于16820416。问题可能处在转换中result的\x已经不是转义字符了。

论坛徽章:
0
5 [报告]
发表于 2009-04-01 14:26 |只看该作者
简单地说一下吧
首先楼主对指针数组的概念混乱,程序里面简直是乱用char *p[4];
然后strtok在循环里面的用法也有错误,最后一次调用strtok返回NULL,赋值给p指针数组时会覆盖之前的结果
再有就是对字符串的操作也不太对,虽然也能达到想要的效果
最后写代码太不细心了,如果你只是想学习一下strtok的使用,那写这样的测试代码还可以理解,否则我就不明白为什么要这样转来转去的了

#include <stdio.h>
#include <string.h> // 加上头文件


int main(int argc, char **argv)
{
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;int i = 0;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;unsigned char buffer[] = "192.168.0.1";
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;unsigned char* drop_ip = "\xc0\xa8\x0\x1"; // 改成"\\xc0\\xa8\\x0\\x1"

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;char *p[4];
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;char *buff = buffer;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;while((p = strtok(buff, ".")) != NULL) // 指针数组使用错误;最后一次调用strtok返回NULL需要特殊处理

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;i++;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;buff = NULL;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;i = 0;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;while(i < 4)
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf("%s\n",p); // 还是指针数组使用错误

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;i++;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;int temp = 0;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;i = 0;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;unsigned char str[12] = "";
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;unsigned char result[12] = "";
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;while(i < 4)
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;temp = atoi(p); //指针数组

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sprintf(str,"%s%X","\\x",temp);
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf("i:%d str:%s\n",i, str);
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sprintf(result,"%s%s",result,str); // 可以使用strcat

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf("i:%d result:%s\n",i, result);
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;i++;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf("result:%d\n",*(unsigned int*)result);
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf("drop_ip:%d\n",*(unsigned int*)drop_ip);
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return 0;
}

论坛徽章:
0
6 [报告]
发表于 2009-04-01 14:28 |只看该作者
下面这个是可以正常运行的程序

#include <stdio.h>
#include <string.h>

int main(int argc, char **argv)
{
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;int i = 0;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;unsigned char buffer[] = "192.168.0.1";
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;unsigned char* drop_ip = "\\xc0\\xa8\\x0\\x1";
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;char *p[4];
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;char *buff = buffer;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;while(1)
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;char* token = strtok(buff, ".");
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if (token != NULL)
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;p[i] = token;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;else
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;break;

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf("p[%d]: %s\n", i, p[i]);
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;buff = NULL;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;i++;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;int temp = 0;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;i = 0;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;unsigned char str[12] = "";
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;unsigned char result[12] = "";
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;while(i < 4)
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;temp = atoi(p[i]);
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sprintf(str,"%s%x","\\x",temp);
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf("i:%d str:%s\n",i, str);
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sprintf(result,"%s%s",result,str);
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf("i:%d result:%s\n",i, result);
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;i++;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf("result == drop_ip ? %s\n", strcmp(result, drop_ip) == 0 ? "yes" : "no");
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf("result:%d\n",*(unsigned int*)result);
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf("drop_ip:%d\n",*(unsigned int*)drop_ip);
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return 0;
}

论坛徽章:
0
7 [报告]
发表于 2009-04-01 14:33 |只看该作者
c版的兄弟都很热心

论坛徽章:
0
8 [报告]
发表于 2009-04-01 14:50 |只看该作者

回复 #5 雨过白鹭洲 的帖子

谢谢纠正 指针数组p在粘贴代码的时候出错了,漏掉了下标的访问,不知道为何;程序编译的时候并没有提示需要头文件string.h,编译没出错;strcat我也使用了,但运行程序后,出现崩溃,所以改用sprintf函数。strtok函数只是临时用了下,以后编程回注意了,再次感谢。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP