数据转换

 

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 }
 
   

 

 

你可能感兴趣的:(转换)