整数値をアスキーコードに変換する方法 (_itoa_s関数使用)
はじめに
例えば、124や0x2Fなどの整数値をアスキーコードに変換しようとする場合は、_itoa_sを使うと簡単に変換できます。
関数仕様については、MSDNのドキュメントをご確認ください。
errno_t _itoa_s( int value, char *buffer, size_t sizeInCharacters, int radix );
環境
- Visual Studio Community 2017
- C++コンソールアプリケーション
コード
コードを以下に記載します。
#include "stdafx.h" #include <stdlib.h> #include <string.h> int main() { int i; char buffer[33] = { 0 }; printf("Enter a number: "); scanf_s("%X", &i); // 入力した値を、基数(10)に従ってアスキーコードに変換 _itoa_s(i, buffer, 10); printf("decimal: %s\n", buffer); printf("buffer length: %d\n", static_cast<int>(strlen(buffer))); // 入力した値を、基数(16)に従ってアスキーコードに変換 _itoa_s(i, buffer, 16); printf("hexadecimal: %s\n", buffer); printf("buffer length: %d\n", static_cast<int>(strlen(buffer))); // 入力した値を、基数(2)に従ってアスキーコードに変換 _itoa_s(i, buffer, 2); printf("binary: %s\n", buffer); printf("buffer length: %d\n", static_cast<int>(strlen(buffer))); // バッファクリアテスト printf("\r\n\r\n---- buffer zero clear ---- \r\n\r\n"); memset(buffer, 0, sizeof(buffer)); for (int i = 0; i < sizeof(buffer); i++) { printf("buffer[%d] = %d\r\n", i, buffer[i]); } // _itoa_s関数テスト printf("\r\n\r\n---- execute _itoa_s ---- \r\n\r\n"); int targetNum = 0x2F; _itoa_s(targetNum, buffer, 16); printf("hexadecimal: %s\n", buffer); printf("buffer length: %d\n", strlen(buffer)); for (int i = 0; i < sizeof(buffer); i++) { printf("buffer[%d] = %d\r\n", i , buffer[i]); } system("pause"); return 0; }
テスト結果
基数に従って、アスキーコードに変換されていることがわかります。
Enter a number: 100 decimal: 256 buffer length: 3 hexadecimal: 100 buffer length: 3 binary: 100000000 buffer length: 9 ---- buffer zero clear ---- buffer[0] = 0 buffer[1] = 0 buffer[2] = 0 buffer[3] = 0 buffer[4] = 0 buffer[5] = 0 buffer[6] = 0 buffer[7] = 0 buffer[8] = 0 buffer[9] = 0 buffer[10] = 0 buffer[11] = 0 buffer[12] = 0 buffer[13] = 0 buffer[14] = 0 buffer[15] = 0 buffer[16] = 0 buffer[17] = 0 buffer[18] = 0 buffer[19] = 0 buffer[20] = 0 buffer[21] = 0 buffer[22] = 0 buffer[23] = 0 buffer[24] = 0 buffer[25] = 0 buffer[26] = 0 buffer[27] = 0 buffer[28] = 0 buffer[29] = 0 buffer[30] = 0 buffer[31] = 0 buffer[32] = 0 ---- execute _itoa_s ---- hexadecimal: 2f buffer length: 2 buffer[0] = 50 buffer[1] = 102 buffer[2] = 0 buffer[3] = -2 buffer[4] = -2 buffer[5] = -2 buffer[6] = -2 buffer[7] = -2 buffer[8] = -2 buffer[9] = -2 buffer[10] = -2 buffer[11] = -2 buffer[12] = -2 buffer[13] = -2 buffer[14] = -2 buffer[15] = -2 buffer[16] = -2 buffer[17] = -2 buffer[18] = -2 buffer[19] = -2 buffer[20] = -2 buffer[21] = -2 buffer[22] = -2 buffer[23] = -2 buffer[24] = -2 buffer[25] = -2 buffer[26] = -2 buffer[27] = -2 buffer[28] = -2 buffer[29] = -2 buffer[30] = -2 buffer[31] = -2 buffer[32] = -2 続行するには何かキーを押してください . . .
16進数の値をアスキーコードに変換して、動的配列(std::vector)に格納する。その後、std::vectorをchar配列に変換
#include "stdafx.h" #include <iostream> #include <vector> int main() { std::vector<char> v; // 16進数の値をアスキーコードに変換して、動的配列(std::vector<char>)に格納する for (int i = 0; i < 16; i++) { char buffer[3] = { 0 }; _itoa_s(i, buffer, 16); for (int j = 0; j < strlen(buffer); j++) { v.push_back(buffer[j]); } } printf("\r\n\r\n---- result ---- \r\n\r\n"); for (int x : v) { std::cout << x << std::endl; } printf("\r\n\r\n---- result(16進数表示) ---- \r\n\r\n"); for (int x : v) { std::cout << "0x" << std::hex << x << std::endl; } // std::vector<char>をchar配列に変換 printf("\r\n\r\n---- std::vector<char>をchar配列に変換 ---- \r\n\r\n"); int nSize = v.size(); char *strResult = new char[nSize]; memcpy_s(strResult, nSize, v.data(), nSize); for (int i = 0; i < nSize; i++) { printf("%02X(code : %c)\r\n", *(strResult + i), *(strResult + i)); } system("pause"); delete[] strResult; return 0; }
---- result ---- 48 49 50 51 52 53 54 55 56 57 97 98 99 100 101 102 ---- result(16進数表示) ---- 0x30 0x31 0x32 0x33 0x34 0x35 0x36 0x37 0x38 0x39 0x61 0x62 0x63 0x64 0x65 0x66 ---- std::vector<char>からchar配列に変換 ---- 30(code : 0) 31(code : 1) 32(code : 2) 33(code : 3) 34(code : 4) 35(code : 5) 36(code : 6) 37(code : 7) 38(code : 8) 39(code : 9) 61(code : a) 62(code : b) 63(code : c) 64(code : d) 65(code : e) 66(code : f)