求教各位大神 十六进制码转换为字符串的问题,多谢

luzhej521163com 2012-06-19 09:27:11
现有16进制码流如下,输入:
31333530303030303030300000000000000000000001333200003235300002
预期得到如下结果,输出:
1350000000013725002

其中个字段拆分如下:
13500000000
1
37
250
02


对应字段属性如下:

字段名 字节数 属性
Num 21 C-Octet String
type 1 Unsigned Integer
codeA 4 C-Octet String
codeB 4 C-Octet String
times 2 Octet String


基本数据类型:
  Integer  无符号整数

C-OctetString  变长字符串,以空字符表示字符串结束

OctetString  定长字符串,位数不足时,右补空


诚心求教各位大神,望各位大神不吝赐教啊,多谢
...全文
196 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
luzhej521163com 2012-06-19
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 的回复:]
313335303030303030303000000000000000000000 21个字节ASCII码13500000000
01 1
33320000 这个37是怎么来的?
32353000 250
02 02
[/Quote]

这个“13500000000” 求教一下如何转换和反转啊
yulinlang 2012-06-19
  • 打赏
  • 举报
回复
313335303030303030303000000000000000000000 21个字节ASCII码13500000000
01 1
33320000 这个37是怎么来的?
32353000 250
02 02
firendlys 2012-06-19
  • 打赏
  • 举报
回复
主要看不懂有:
1) 37 是怎么来的?
2) 最后的 CodeB 和 times , CodeB 占4个字节,应该是 2500 才对,那么最后的 times ,就只剩下 2 这一个字节,何来2个字节?

其实这个应该不难,先全部转化为十六进制,再按长度解释就是了.

假如转化之后的十六进制数组是 char *a;
那么,

char *num = a;//得到字符串 "135" Num 21 C-Octet String :
unsingned int mType = (unsigned int)a[21];//因为 Num 占了前面21个位置 , type 1 Unsigned Integer
char *codeA= a+22;// 前面已经用了 21+1 个字节 , 4 C-Octet String
char *codeB= a+26;// 前面已经用了 21+1+4个字节 4 C-Octet String
char *times= a+30;// 前面已经用了 21+1+4+4个字节. 2 Octet String
// 注意,你必须优先校验 输入字符串 的准确性(至少长度要正确),
// 否则,就会出现我上面提到的第二点:times明明是2个字节,而且是字符串(意味着最后一个是0),但输入的字符串却只剩下1个字节,这么以来, times 这个变量就没有结束字符,一旦调用,就会出错.


至于字符串转化为十六进制,我提供一个我自己写的函数(不过效率不太高),你试试

char _toHexChar(char ch_hexstr)
{
if(ch_hexstr>='0' && ch_hexstr<='9')
{
return ch_hexstr-'0';
}
if (ch_hexstr>='a' && ch_hexstr<='f')
{
return ch_hexstr-'a'+10;
}
if (ch_hexstr>='A' && ch_hexstr<='F')
{
return ch_hexstr-'A'+10;
}
if (ch_hexstr==' ' || ch_hexstr==',')
{
return -1;
}
return -2;

}


//通用 字符串-->十六进制数组 转换模板
template<typename _chartype,typename _hextype>// _chartype=char/wchar_t _hextype=uchar/ushort/uint
long __template_hexstr_to_array(const _chartype *s,_hextype *ret_hex,int hexBuffLen)
{
static int iSize = sizeof(_hextype)*2;
if (!s || !ret_hex)//输入或输出为空
{
return 0;
}
int i=0,//str index
j=0,//bit index
ss=0;//sum
_hextype hextmp;
//char bit4[sizeof(_hextype)];// int64需要16个字节缓冲区
char ctype;
while(s[i])
{
//丢弃 0x 和 0X
if (s[i]=='0' && (s[i+1]=='x'|| s[i+1]=='X'))
{
i+=2;
if (s[i]=='0' && (s[i+1]=='x'|| s[i+1]=='X'))
{
break;//连续出现2个 0x
}
continue;
}
//分组,同时转换
hextmp = 0;
ctype = 0;
for(j=0;j<iSize && ctype>=0;j++)
{
if((ctype = _toHexChar((char)s[i])) >=0 )
{
hextmp = (hextmp<<4) | ctype;
i++;
}else
{
i++;
continue;//exit for
}
}
if (j==1)//第一个就是无效字符了,丢弃这个分组
{
continue;
}

ret_hex[ss] = hextmp;
ss++;
if (hexBuffLen && ss>=hexBuffLen)//输出缓冲区长度不够
{
break;
}
}
return ss;
};


//使用:
char *str = "1234545776746345353";
char ret_hex[100];//输出缓冲区,保证缓冲区足够大
long retsum = __template_hexstr_to_array<char,char>(str,ret_hex,100);
//retsum 是转换后的十六进制的长度.
firendlys 2012-06-19
  • 打赏
  • 举报
回复
老实说,我也看不懂这是怎么变的.
W170532934 2012-06-19
  • 打赏
  • 举报
回复
楼主这是怎么变的啊??
赵4老师 2012-06-19
  • 打赏
  • 举报
回复
VC调试(TC或BC用TD调试)时按Alt+8、Alt+6和Alt+5,打开汇编窗口、内存窗口和寄存器窗口看每句C对应的汇编、单步执行并观察相应内存和寄存器变化,这样过一遍不就啥都明白了吗。
对VC来说,所谓‘调试时’就是编译连接通过以后,按F10或F11键单步执行一步以后的时候,或者在某行按F9设了断点后按F5执行停在该断点处的时候。
赵4老师 2012-06-19
  • 打赏
  • 举报
回复
推荐使用WinHex软件查看文件或内存中的原始字节内容。
qq120848369 2012-06-19
  • 打赏
  • 举报
回复
没看懂怎么变的。
yulinlang 2012-06-19
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 的回复:]

引用 7 楼 的回复:
313335303030303030303000000000000000000000 21个字节ASCII码13500000000
01 1
33320000 这个37是怎么来的?
32353000 250
02 02


这个“13500000000” 求教一下如何转换和反转啊
[/Quote]

http://zh.wikipedia.org/zh/ASCII
赵4老师 2012-06-19
  • 打赏
  • 举报
回复
关于自己是否适合编程的很简单的测试:
在报纸或杂志上随便找一段约1000字的文章,在Word中输入一遍。输完后再参考下面答案:

A里面有10处以上文字或标点错误
B里面没有文字或标点错误并敢为此跟人打赌
C里面没有文字或标点错误并且字体和排版完全与原稿一致
D打印在半透明的纸上和原稿重叠在一起检查一模一样,且自我感觉很有成就感

A不适合编程(理由:打字准确度偏低、粗心大意)
B初级程序员(理由:打字准确度很高、认真细致、自信、理解全角半角概念)
C高级程序员(理由:在B的基础上理解字体和排版也是电脑打印的重要因素、但相比D还不够偏执、精益求精、结果可验证)
D软件项目经理(理由:能针对项目给出令人信服的细致到极点的需求说明和典型测试用例。用户几乎挑不出毛病。专业!)

如果想从A变成B的话,到我的资源http://download.csdn.net/detail/zhao4zhong1/4084259里面下载“适合程序员的键盘练习”
luzhej521163com 2012-06-19
  • 打赏
  • 举报
回复
不好意思有个字段搞错了,不是37,是32

69,381

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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