数据转换

 

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 }

 

 

posted on 2012-11-06 15:24  凌峰布衣  阅读(591)  评论(0编辑  收藏  举报

导航