数据转换
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 6》char* 转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 9》string 和char*转int 207 208 209 string 转 int 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 14》char *转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 string 转 int 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 int 转 string 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 int 转 char * 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 string 转 char * 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 }