char 转CString 出现乱码

jiangnandeyuqiuerduo 2013-11-15 08:27:45
char(不是char*)转CString 出现乱码

//定义IP头部结构
typedef struct IP_HEAD
{
union
{
unsigned char Version;
unsigned char HeadLen;
};
unsigned char ServiceType;
unsigned short TotalLen;
unsigned short Identifier;
union
{
unsigned short Flags;
unsigned short FragOffset;
};
unsigned char TimeToLive;
unsigned char Protocol;
unsigned short HeadChecksum;
unsigned int SourceAddr;
unsigned int DestinAddr;
}ip_head;


ip_head IpHead = *(ip_head*)RecvBuf;
//一次解析IP头部的相应字段
result="版本 总长度 标志位 片偏移 协议 源地址 目的地址\n";
p[0].Format(L"%c",IpHead.Version);
result+=p[0]+_T(" ");
Output_text.SetWindowText(result);


IpHead.Version 是unsigned char类型, 用setwindowtext()输出的话要转成CString 可是p[0].format()改成%s会崩溃 %c会输出乱码 下面的int类型转换正常 应该怎么办 unicode环境
...全文
292 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
副组长 2013-11-16
  • 打赏
  • 举报
回复
result="版本..." 这里也要用_T("版本...")宏。 是不是显示收来的数据了?传的时候需要看转换的对不对。
vcorange 2013-11-16
  • 打赏
  • 举报
回复
ip头定义有问题 //IP头 #pragma pack(1) typedef struct _ipheader { unsigned char h_lenver; //4位首部长度+4位IP版本号,小端布局 iphdrlen:4 version:4 大端布局 versio:4 iphdrlen:4 unsigned char tos; //8位服务类型TOS unsigned short total_len; //16位总长度(字节) unsigned short ident; //16位标识 unsigned short frag_and_flags; //3位标志位和13位用于储存分段偏移 unsigned char ttl; //8位生存时间 TTL unsigned char proto; //8位协议 (TCP, UDP 或其他) unsigned short checksum; //16位IP首部校验和 unsigned int srcaddr; //32位源IP地址 unsigned int destaddr; //32位目的IP地址 }IP_HEADER,*PIP_HEADER; #pragma pack() ////////////////////////////////////////////////////////////////////////// //IP TOS //遵照DSCP的定义 //CODEPOINT定义 值 二进制 //命名 //丢包处理 #define IP_TOS_BE 0 // 0 //routine #define IP_TOS_AF11 10 // 001010 //priority //low #define IP_TOS_AF12 12 //001100 //priority //medium #define IP_TOS_AF13 14 //001110 //priority //high #define IP_TOS_AF21 18 //010010 //immediate //low #define IP_TOS_AF22 20 //010100 //immediate //medium #define IP_TOS_AF23 22 //010110 //immediate //high #define IP_TOS_AF31 26 //011010 //flash //low #define IP_TOS_AF32 28 //011100 //flash //medium #define IP_TOS_AF33 30 //011110 //flash //high #define IP_TOS_AF41 34 //100010 //flash override //low #define IP_TOS_AF42 36 //100100 //flash override //medium #define IP_TOS_AF43 38 //100110 //flash override //high #define IP_TOS_EF 46 //101110 //critical #define IP_TOS_CS1 8 //001000 #define IP_TOS_CS2 16 //010000 #define IP_TOS_CS3 24 //011000 #define IP_TOS_CS4 32 //100000 #define IP_TOS_CS5 40 //101000 #define IP_TOS_CS6 48 //110000 #define IP_TOS_CS7 56 //111000 //获取IP tos值 DSCP #define IPTOS(iphdr) (((iphdr) -> tos) & 63) //IP报文分片 //下面的IP报文分片宏的offset参数没有根据 8字节整倍数 和 MTU大小划分,需要自行划分 //offset必须满足8位字的整倍数 //IP报文不分片标识 0,1,0 RF=0, DF=1,MF=0 Don't Fragment 不分包标识 参数offset 仅作为占位符,应该设置为 0 #ifndef SET_IPFRAG_DF #define SET_IPFRAG_DF(offset) (unsigned short) ( (unsigned short) (0x0002 << 13) | (unsigned short) ( ( (unsigned short)(offset)>>3) & 0x1FFF )) #endif //IP报文分片标识 0,0,0 RF=0,DF=0,MF=0 标识最后一个分片,参数offset指定偏移开始地址 #ifndef SET_IPFRAG_LF #define SET_IPFRAG_LF(offset) (unsigned short) ( (unsigned short) (0x0000 << 13) | (unsigned short) ( ( (unsigned short)(offset)>>3) & 0x1FFF )) #endif //IP报文分片标识 0,0,1 RF=0,DF=0,MF=1 标识更多分片,参数offset指定偏移开始地址 #ifndef SET_IPFRAG_MF #define SET_IPFRAG_MF(offset) (unsigned short) ( (unsigned short) (0x0001 << 13) | (unsigned short) ( ( (unsigned short)(offset)>>3) & 0x1FFF )) #endif //获取IP报文的分片标识 //结果: 0为DF=0,MF=0 分片,最后一个分片 // 2为DF=1,MF=0 不分片标识 // 1为DF=0,MF=1 分片,更多分片 #ifndef IPHDR_FRAG #define IPHDR_FRAG(iphdr) (( H2N_S((((IP_HEADER*)(iphdr)) -> frag_and_flags)) >> 13 ) & 0x7) #endif //不分片标识 #ifndef IPFRAG_DF #define IPFRAG_DF 0x0002 #endif //分片,更多分片 #ifndef IPFRAG_MF #define IPFRAG_MF 0x0001 #endif //分片,最后分片 #ifndef IPFRAG_LF #define IPFRAG_LF 0x0000 #endif //获取IP报文的分片偏移 #ifndef IPFRAG_OFFSET #define IPFRAG_OFFSET(iphdr) (( H2N_S((((IP_HEADER*)(iphdr)) -> frag_and_flags)) << 3 ) & 0x1FFF) #endif ////////////////////////////////////////////////////////////////////////// //获取IPV4报文头部的长度 #ifndef IPHDRLEN #define IPHDRLEN(iphdr) (((((IP_HEADER*)(iphdr)) -> h_lenver) & 0xF) * 4) #endif //获取IPv4报文头部版本号--正确的是4 #ifndef IPHDRVER #define IPHDRVER(iphdr) (((iphdr)->h_lenver>>4) & 0xF) #endif //设置IPV4报文头部长度及其版本号(固定为4) #ifndef SET_IPHDRLEN #define SET_IPHDRLEN(hdrlen) (4 << 4 | (hdrlen) / 4) #endif
zgl7903 2013-11-16
  • 打赏
  • 举报
回复
char用 %d unsigned char用 %u
昨夜无风 2013-11-15
  • 打赏
  • 举报
回复
IpHead.Version超过了256了把,打印出来看看他的值是多少?
yanghongche 2013-11-15
  • 打赏
  • 举报
回复
如果你的程序是UNICODE环境的话,程序中用到的数据类型尽量都用UNICODE类型的,比如char改成WCHAR,如果改不了这个的话,就得需要ANSI转UNICODE码了,百度一下就知道怎么转了
_菜菜 2013-11-15
  • 打赏
  • 举报
回复
%c %s 要用大写的,小写的不行
白衣的逆袭 2013-11-15
  • 打赏
  • 举报
回复
1.可以直接等于 2.用Format()函数的话先转成TCHAR才可以,char转TCHAR可以用MultiByteToWideChar函数

16,472

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Web++
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

试试用AI创作助手写篇文章吧