• 数据转换


     

    1
    #ifndef CONVERTTOOL_H_ 2 #define CONVERTTOOL_H_ 3 #include "isEndian.h" 4 #include <string.h> 5 #include <stdlib.h> 6 int getCharFromInt(int v,char buf[]){ 7 int i=0; 8 if(!isEndian()){ 9 for (int i = 0; i < sizeof(buf); i++){ 10 buf[i] = (unsigned char) (v & 0x000000ff); 11 v >>= 8; 12 return i;} 13 } 14 else{ 15 for (int i = (sizeof(buf)-1); i>=0; i--){ 16 buf[i] = (unsigned char) (v & 0x000000ff); 17 v >>= 8; 18 return i;} 19 } 20 i = 1; 21 return i; 22 23 } 24 25 int getCharFromFloat(float f,char buf[]){ 26 char *tmp=NULL; 27 tmp = (char *)malloc(sizeof(float)); 28 char *p=(char *)buf; 29 gcvt(f,16,tmp); 30 strncpy(p,tmp,4); 31 buf = (char *)p; 32 free(tmp); 33 return 0; 34 } 35 36 int getIntFromChar(char buf[]){ 37 int n = *(int *)buf; 38 return n; 39 } 40 41 float getFloatFromChar(char buf[]){ 42 float tmp=0.00f; 43 tmp = strtof(buf,NULL); 44 return tmp; 45 } 46 #endif

      1 最近编程一直头痛这集中类型的转化,明知都可以转却总是记不住,不断的上网查来查去,在这里小结一下。以备以后方便使用,当然有些方法可能不是最新的,或者最简单的,但是对于自己已经了解的使用起来应该方便的多:
      2 
      3 1》string转wstring
      4 
      5 wstring s2ws(const string& s)
      6 
      7 {
      8 
      9     _bstr_t t = s.c_str();
     10 
     11     wchar_t* pwchar = (wchar_t*)t;
     12 
     13     wstring result = pwchar;
     14 
     15     return result;
     16 
     17 }
     18 
     19 2》wstring转string
     20 
     21 string ws2s(const wstring& ws)
     22 
     23 {
     24 
     25     _bstr_t t = ws.c_str();
     26 
     27     char* pchar = (char*)t;
     28 
     29     string result = pchar;
     30 
     31     return result;
     32 
     33 }
     34 
     35 3》string转cstring 
     36 
     37 a)CString.format("%s", string.c_str());  
     38 
     39  
     40 
     41 b)CString StringToCString(string str)
     42 
     43 {
     44 
     45 CString result;
     46 
     47 for (int i=0;i<(int)str.length();i++)
     48 
     49 {
     50 
     51  result+=str[i];
     52 
     53 }
     54 
     55 return result;
     56 
     57 }
     58 
     59  
     60 
     61 4》cstring转string
     62 
     63 a)void ConvertCString2string(CString& strSrc,std::string& strDes)
     64 
     65 {
     66 
     67 #ifndef UNICODE
     68 
     69     strDes = strSrc;
     70 
     71 #else 
     72 USES_CONVERSION;
     73 
     74     strDes = W2A(strSrc.LockBuffer());
     75 
     76     strSrc.UnlockBuffer();
     77 
     78 #endif
     79 
     80 }
     81 
     82 b)
     83 
     84 string s(CString.GetBuffer());  
     85 
     86 ReleaseBuffer();
     87 
     88 
     89 GetBuffer()后一定要ReleaseBuffer(),否则就没有释放缓冲区所占的空间.
     90 
     91 c)
     92 
     93 string CStringToString(CString cstr)
     94 {
     95 string result(cstr.GetLength(),'e');
     96 for (int i=0;i<cstr.GetLength();i++)
     97 {
     98  result[i]=(char)cstr[i];
     99 }
    100 return result;
    101 }
    102 
    103 5》string转char *
    104 
    105 a)char *p = string.c_str();  
    106 
    107 举例:
    108  string aa("aaa"); 
    109  char *c=aa.c_str(); 
    110  string mngName; 
    111  char t[200]; 
    112  memset(t,0,200); 
    113  strcpy(t,mngName.c_str());
    114 
    115 b)一个一个字符的赋值
    116 
    117  
    118 
    119 char *p = new char[sring的长度+1];
    120 
    121 
    122 p[string的长度]='/0';
    123 
    124 
    125 但是要注意最后赋值'/0'!!!
    126 
    127 
    128  
    129 
    130 char * StringToChar(string &str)
    131 
    132 
    133 {
    134 
    135 
    136 int len=str.length();
    137 
    138 
    139 char * p= new char[len+1];
    140 
    141 
    142 for (int i=0;i<len;i++)
    143 
    144 
    145 {
    146 
    147 
    148 p[i]=str[i];
    149 
    150 
    151 }
    152 
    153 
    154 p[len]='/0';
    155 
    156 
    157 }
    158 
    159 
    160 6char* 转string
    161 
    162 string s(char *);  
    163 你的只能初始化,在不是初始化的地方最好还是用assign();
    164 
    165 
    166 string CharToString(char*arr,int count)
    167 {
    168 string result(arr,4);
    169 return result;
    170 }
    171 
    172 string是ansi编码字符char
    173 
    174 
    175 TCHAR是unicode编码字符wchar_t
    176 
    177 
    178 7》string转TCHAR *
    179 
    180 
    181 /*
    182   wBuf 申明为指针即可。
    183 */
    184 wchar_t *chr2wch(const char *buffer)
    185 {
    186         size_t len = strlen(buffer);
    187         size_t wlen = MultiByteToWideChar(CP_ACP, 0, (const char*)buffer, int(len), NULL, 0);
    188         wchar_t *wBuf = new wchar_t[wlen + 1];
    189         MultiByteToWideChar(CP_ACP, 0, (const char*)buffer, int(len), wBuf, int(wlen));
    190         return wBuf;
    191 } 
    192 
    193 8》TCHAR *转string
    194 
    195 
    196 char * wch2chr(LPCTSTR lpString)
    197 {
    198 // Calculate unicode string length.
    199 UINT len = wcslen(lpString)*2;
    200 char *buf = (char *)malloc(len);
    201 UINT i = wcstombs(buf,lpString,len);
    202 return buf;
    203 }
    204 
    205 
    206 9string 和char*转int
    207 
    208 
    209 stringint
    210 ..............................
    211 char* 转 int 
    212  #include <stdlib.h> 
    213   
    214  int atoi(const char *nptr); 
    215  long atol(const char *nptr); 
    216  long long atoll(const char *nptr); 
    217  long long atoq(const char *nptr); 
    218 
    219 
    220 10》int转char*和string
    221 
    222 
    223 在stdlib.h中有个函数itoa() 
    224  itoa的用法: 
    225  itoa(i,num,10); 
    226  i 需要转换成字符的数字 
    227  num 转换后保存字符的变量 
    228 
    229 
    230 11》wstring转Csting
    231 
    232 
    233 std::wstring转CString
    234 
    235 
    236 CString str( filename.c_str() ); 
    237 
    238 
    239 
    240 12》Cstring转wstring
    241 
    242 CString转std::wstring
    243 
    244 
    245 std::wstring str = filename.GetString();
    246 
    247 
    248 13》Cstring转char *
    249 
    250 
    251 CString cstr(asdd);
    252 
    253 const char* ch = (LPCTSTR)cstr;
    254 
    255 
    256 举例:
    257 
    258 
    259 CString   str= "i   am   good "; 
    260 
    261 char*   lp=str.GetBuffer(str.GetLength()); 
    262 
    263 
    264 str.ReleaseBuffer(); 
    265 
    266 
    267 14char *转Cstring
    268 
    269 举例:
    270 
    271 
    272 CString   str; 
    273 
    274 char   pStr[100]; 
    275 
    276 
    277 str.Format( "%s ",pStr);
    278 
    279 
    280 
    281 15》TCHar转char
    282 
    283 
    284 *********************************************************************** 
    285 
    286 
    287 * 函数: THCAR2Char 
    288 
    289 
    290 * 描述:将TCHAR* 转换为 char* 
    291 
    292 
    293 *********************************************************************** 
    294 
    295 
    296 char* CPublic::THCAR2char(TCHAR* tchStr) 
    297 
    298 
    299 { 
    300 
    301 
    302 int iLen = 2*wcslen(tchStr);//CString,TCHAR汉字算一个字符,因此不用普通计算长度 
    303 
    304 
    305 char* chRtn = new char[iLen+1] 
    306 
    307 
    308 wcstombs(chRtn,tchStr,iLen+1);//转换成功返回为非负值 
    309 
    310 
    311 return chRtn; 
    312 
    313 
    314 } 
    315 
    316 
    317 16》char转tchar
    318 
    319 
    320 定义了UNICODE宏之后,TCHAR就是宽字符wchar_t,否则TCHAR跟char是一样的^_
    321 
    322  
    323 
    324 具体问题具体分析,浮云啊,一切皆是浮云.....
    325 
    326 以下摘录自网络:
    327 
    328 ..............................................................
    329 
    330 《C++标准函数库》中说的  
    331 
    332 有三个函数可以将字符串的内容转换为字符数组和C—string  
    333 
    334 1.data(),返回没有”/0“的字符串数组  
    335 
    336 2,c_str(),返回有”/0“的字符串数组  
    337 
    338 3,copy() 
    339 
    340 .................................................................
    341 
    342 int 转 CString:
    343 
    344 CString.Format("%d",int);
    345 
    346 ...............................
    347 
    348 string 转 CString  
    349 
    350 CString.format("%s", string.c_str());  
    351 
    352 用c_str()确实比data()要好.  
    353 
    354 .......................................
    355 
    356 char* 转 CString  
    357 
    358 CString.format("%s", char*); 
    359 
    360  CString strtest;  
    361 
    362  char * charpoint;  
    363 
    364  charpoint="give string a value";  
    365 
    366  strtest=charpoint; //直接付值
    367 
    368 ...................................................................
    369 
    370 CString 转 int
    371 
    372  CString  ss="1212.12";  
    373 
    374  int temp=atoi(ss); //atoi _atoi64或atol
    375 
    376   
    377 
    378 将字符转换为整数,可以使用atoi、_atoi64或atol。  
    379 
    380 int int_chage = atoi((lpcstr)ss) ;
    381 
    382 或:
    383 
    384    CString str = "23";
    385 
    386    UINT uint;
    387 
    388    sscanf(str, "%d", uint);
    389 
    390 ..............................
    391 
    392 stringint
    393 
    394 ..............................
    395 
    396 char* 转 int 
    397 
    398  #include <stdlib.h> 
    399 
    400   
    401 
    402  int atoi(const char *nptr); 
    403 
    404  long atol(const char *nptr); 
    405 
    406  long long atoll(const char *nptr); 
    407 
    408  long long atoq(const char *nptr); 
    409 
    410 ...................................................................
    411 
    412 CString 转 string
    413 
    414   string s(CString.GetBuffer());  
    415 
    416   GetBuffer()后一定要ReleaseBuffer(),否则就没有释放缓冲区所占的空间.  
    417 
    418 ..........................................
    419 
    420 intstring 
    421 
    422 ..........................................
    423 
    424 char* 转 string  
    425 
    426  string s(char *);  
    427 
    428  你的只能初始化,在不是初始化的地方最好还是用assign().
    429 
    430 ...................................................................
    431 
    432 CString 转 char * 
    433 
    434  CString strtest="wwwwttttttt";
    435 
    436  charpoint=strtest.GetBuffer(strtest.GetLength());
    437 
    438 CString转换 char[100]  
    439 
    440  char a[100];  
    441 
    442  CString str("aaaaaa");  
    443 
    444  strncpy(a,(LPCTSTR)str,sizeof(a));
    445 
    446   CString  str="aaa";   
    447 
    448   char*  ch;   
    449 
    450   ch=(char*)(LPCTSTR)str;
    451 
    452 ..........................................
    453 
    454 intchar *
    455 
    456  在stdlib.h中有个函数itoa() 
    457 
    458  itoa的用法: 
    459 
    460  itoa(i,num,10); 
    461 
    462  i 需要转换成字符的数字 
    463 
    464  num 转换后保存字符的变量 
    465 
    466  10 转换数字的基数(进制)10就是说按照10进制转换数字。还可以是2,8,16等等你喜欢的进制类型 
    467 
    468  原形:char *itoa(int value, char* string, int radix); 
    469 
    470  实例: 
    471 
    472  #include "stdlib.h" 
    473 
    474  #include "stdio.h" 
    475 
    476  main() 
    477 
    478  { 
    479 
    480  int i=1234; 
    481 
    482  char s[5]; 
    483 
    484  itoa(i,s,10); 
    485 
    486  printf("%s",s); 
    487 
    488  getchar(); 
    489 
    490 }
    491 
    492 ..........................................
    493 
    494 stringchar *  
    495 
    496 char *p = string.c_str();  
    497 
    498  
    499 
    500  string aa("aaa"); 
    501 
    502  char *c=aa.c_str();
    503 
    504  string mngName; 
    505 
    506  char t[200]; 
    507 
    508  memset(t,0,200); 
    509 
    510  strcpy(t,mngName.c_str());
    511 
    512 ...................................................................
    513 
    514 标准C里没有string,char *==char []==string
    515 
    516 可以用CString.Format("%s",char *)这个方法来将char *转成CString。要把CString转成char *,用操
    517 
    518 作符(LPCSTR)CString就可以了。
    519 
    520 cannot convert from 'const char *' to 'char *' 
    521 
    522 const char *c=aa.c_str();  
    523 
    524 string.c_str()只能转换成const char *
    525 
    526 
    527 
    528 
    529 
    530 
    531 
    532 
    533 
    534 
    535 
    536 
    537 #include <string>
    538 
    539 // 使用CString必须使用MFC,并且不可包含<windows.h>
    540 
    541 #define _AFXDLL
    542 
    543 #include <afx.h>
    544 
    545 using namespace std;
    546 
    547 //———————————————————————————-
    548 
    549 //将 单字节char* 转换为 宽字节 wchar*
    550 
    551 inline wchar_t* AnsiToUnicode( const char* szStr )
    552 
    553 {
    554 
    555 int nLen = MultiByteToWideChar( CP_ACP, MB_PRECOMPOSED, szStr, -1, NULL, 0 );
    556 
    557 if (nLen == 0)
    558 
    559 {
    560 
    561    return NULL;
    562 
    563 }
    564 
    565 wchar_t* pResult = new wchar_t[nLen];
    566 
    567 MultiByteToWideChar( CP_ACP, MB_PRECOMPOSED, szStr, -1, pResult, nLen );
    568 
    569 return pResult;
    570 
    571 }
    572 
    573 //———————————————————————————-
    574 
    575 // 将 宽字节wchar_t* 转换 单字节char*
    576 
    577 inline char* UnicodeToAnsi( const wchar_t* szStr )
    578 
    579 {
    580 
    581 int nLen = WideCharToMultiByte( CP_ACP, 0, szStr, -1, NULL, 0, NULL, NULL );
    582 
    583 if (nLen == 0)
    584 
    585 {
    586 
    587    return NULL;
    588 
    589 }
    590 
    591 char* pResult = new char[nLen];
    592 
    593 WideCharToMultiByte( CP_ACP, 0, szStr, -1, pResult, nLen, NULL, NULL );
    594 
    595 return pResult;
    596 
    597 }
    598 
    599 //———————————————————————————-
    600 
    601 // 将单字符 string 转换为宽字符 wstring
    602 
    603 inline void Ascii2WideString( const std::string& szStr, std::wstring& wszStr )
    604 
    605 {
    606 
    607 int nLength = MultiByteToWideChar( CP_ACP, 0, szStr.c_str(), -1, NULL, NULL );
    608 
    609 wszStr.resize(nLength);
    610 
    611 LPWSTR lpwszStr = new wchar_t[nLength];
    612 
    613 MultiByteToWideChar( CP_ACP, 0, szStr.c_str(), -1, lpwszStr, nLength );
    614 
    615 wszStr = lpwszStr;
    616 
    617 delete [] lpwszStr;
    618 
    619 }
    620 
    621 //———————————————————————————-
    622 
    623 int _tmain(int argc, _TCHAR* argv[])
    624 
    625 {
    626 
    627 char*   pChar = “我喜欢char”;
    628 
    629 wchar_t* pWideChar = L”我讨厌wchar_t”;
    630 
    631 wchar_t   tagWideCharList[100] ;
    632 
    633 char   ch = ‘A’;
    634 
    635 char   tagChar[100] = {NULL};
    636 
    637 CString   cStr;
    638 
    639 std::string str;
    640 
    641 
    642 
    643 // 注:设置语言环境以便输出WideChar
    644 
    645 setlocale(LC_ALL,”chs”);
    646 
    647 
    648 
    649 // 注: char* 转换 wchar_t*
    650 
    651 // 注: wchar_t 未重载 << ,所以不可使用 cout << 输出
    652 
    653 pWideChar = AnsiToUnicode( pChar );
    654 
    655 // 注:printf(”%ls”) 和 wprintf(L”%s”) 一致
    656 
    657 printf( “%ls/n”, pWideChar );
    658 
    659 
    660 
    661 // 注:wchar_t* 转换 wchar_t[]
    662 
    663 wcscpy ( tagWideCharList, pWideChar );
    664 
    665 wprintf( L”%s/n”, tagWideCharList );
    666 
    667 
    668 
    669 // 注:wchar_t[] 转换 wchar_t*
    670 
    671 pWideChar = tagWideCharList;
    672 
    673 wprintf( L”%s/n”, pWideChar );
    674 
    675 
    676 
    677 // 注:char 转换 string
    678 
    679 str.insert( str.begin(), ch );
    680 
    681 cout << str << endl;
    682 
    683 
    684 
    685 // 注:wchar_t* 转换 string
    686 
    687 pWideChar = new wchar_t[str.length()];
    688 
    689 swprintf( pWideChar, L”%s”, str.c_str());
    690 
    691 wprintf( L”%s/n”, pWideChar );
    692 
    693 
    694 
    695 // 注:string 转换 char*
    696 
    697 pChar = const_cast<char*>(str.c_str());
    698 
    699 cout << pChar << endl;
    700 
    701 
    702 
    703 // 注:char* 转换 string
    704 
    705 str = std::string(pChar);
    706 
    707 // 注: cout 的 << 重载了string, 若printf 的话必须 printf(”%s”, str.c_str());
    708 
    709 //   而不可 print( “%s”, str ); 因为 str 是个 string 类
    710 
    711 cout << str << endl;
    712 
    713 
    714 
    715 // 注:string 转换 char[]
    716 
    717 str = “无聊啊无聊”;
    718 
    719 strcpy( tagChar, str.c_str() );
    720 
    721 printf( “%s/n”, tagChar );
    722 
    723 
    724 
    725 // 注:string 转换 CString;
    726 
    727 cStr = str.c_str();
    728 
    729 
    730 
    731 // 注:CString 转换 string
    732 
    733 str = string(cStr.GetBuffer(cStr.GetLength()));
    734 
    735 
    736 
    737 // 注:char* 转换 CString
    738 
    739 cStr = pChar;
    740 
    741 
    742 
    743 // 注:CString 转换 char*
    744 
    745 pChar = cStr.GetBuffer( cStr.GetLength() );
    746 
    747 
    748 
    749 // 注:CString 转换 char[]
    750 
    751 strncpy( tagChar, (LPCTSTR)CString, sizeof(tagChar));
    752 
    753 
    754 
    755 // 注:CString 转换 wchar_t*
    756 
    757 pWideChar = cStr.AllocSysString();
    758 
    759 printf( “%ls/n”, pWideChar );
    760 
    761 }
    
    
    
     
  • 相关阅读:
    f12 接口自动刷新页面 来不及看接口信息 前端有没有传值
    order by 分组报错 shop 有三个字段 根据author 选出最大的price
    mybatis 动态sql
    正则 只有英文或者数字 长度6位以上 数字或者英文全部一样
    sql :1 :2
    前端Json数据,后台String接收,如何解析
    Json数据格式化
    LeetCode63. 不同路径 II
    LeetCode62. 不同路径
    LeetCode746. 使用最小花费爬楼梯
  • 原文地址:https://www.cnblogs.com/zhangsf/p/2757054.html
Copyright © 2020-2023  润新知