当前位置:C++技术网 > 资讯 > 数据转换问题 CString 转换BYTE 的问题

数据转换问题 CString 转换BYTE 的问题

更新时间:2016-08-23 19:25:55浏览次数:1+次

目标:取出数据库中的数据,保存到BYTE数组的一个数据单元中,数据转换的问题

数据库中取出一个整形数据,然后转换为16进制的字符串, 现在想保存到BYTE 数组单元中

该如何转换?

CString str;
m_ado.GetFieldByIndex(9, n);   // 数据库取值
str.Format(_T("%02X"), n);     //转换为16进制
BufItem[3] = str;            // 提示 CString 不与BYTE 类型兼容


C++技术网解答:

    通过QQ进一步了解到,n的声明为:

int n;

    在:

m_ado.GetFieldByIndex(9, n);   // 数据库取值

    执行后,n得到正确的整数数值。现在想将数据存储在BYTE数组中。问题是,想将数据以十六进制存储于BYTE数组。这是一个问题,不是说不会存储的问题,而是知识理解错误的问题。

    在计算机内部,存储数据全部都是二进制,你没办法存储十六进制。因为计算机内部只有01两个状态,无法直接表示十六进制。八进制、十进制、十六进制只是我们在存储数据或者读取时一个表示形式,并不影响数据本身。数字15,十进制的,用八进制表示是17,用十六进制表示是F。虽然表示各有不同,但是在计算机总是1111。

    n是十进制数据,你再转成十六进制,然后将十六进制存进去,你只是换了一个表示形式,并没有改变数值本身。所以是没有意义的。就好比现在n是10,就和上面的例子一样。不管你怎么转变进制,对应计算机内部的二进制,都是一样的。

    跟你你给出的代码,揣测你的用意,也就是将得到的十进制的n格式化为十六进制的str,然后存到BufItem[3]中。和上面说的就是一个套路。何况,直接将CString这个字符串类型赋值给BYTE类型,自然是类型不兼容的。一个是字符串一个是整数,不是一个妈生的。

    而如果你执意要这么做,那你需要的就是先将str再转成数字,这样再赋值给BufItem[3]。str格式化后,确实是十六进制的格式的数值字符串,然而转换成数字后,也会转成对应的十六进制的数值,而这个数值和十进制的n对应的二进制还是一样的。也就是说,你将str转成十六进制的数值后,再赋值给BufItem[3]和直接将n赋值给BufItem[3]是一个效果。

    当然,为了全面讲述一下知识,所以这里简单说下如何将CString转成数字。

    C/C++中将字符串转换为数字的函数声明如下:

double atof( const char *string );
int atoi( const char *string );
_int64 _atoi64( const char *string );
long atol( const char *string );
     则是char版本,也就是CStringA版本,如果你用的是Unicode字符集,这几个函数是无法转换的,字符集不一样。既然你是用的中性的CString,那么我们对应用中性的转换函数版本就好。将atoi或atol函数名换为_ttoi或者_ttol就可以了,然后参数使用TCHAR代替char。代码如下:

int value = _ttoi(str.GetBuffer());
str.ReleaseBuffer();
     这样就将CString的字符串转为了数字。不过这个数字是十进制的。因为进制只是表示方法,不要在意最后得到的是十进制的数字。