初心者です。
テキストデータ(ASCII)として取り込んだ
「05 50 0E」
といった文字列を
そのままバイナリデータ(16進)としての
「05 50 0E」
に変換したいのですが、こういった処理をする関数ってあるでしょうか?
もしなければ作ってみたいのですが、その際の考え方や有用な関数などありましたら教えていただけると嬉しいです。

このQ&Aに関連する最新のQ&A

A 回答 (4件)

#include <stdlib.h>


typedef unsigned char byte;
void a2b(char *asc, byte *bin)
{
while (*asc)
*bin++ = (byte)strtol(asc, &asc, 16);
}

と定義しておいて、

void main(int, char**, char**)
{
byte bin[3];
a2b("05 50 0e", bin);
}

と呼べばbinにバイナリが入りますよ。

strtolの仕様はマニュアルで確認してくださいね。
    • good
    • 0
この回答へのお礼

すいません!
お礼が遅れました。
わざわざサンプルまで書いていただいて有難うございました!

お礼日時:2001/03/23 18:33

ライブラリはよくわからないので考え方を・・・



1:処理する文字は数字の'0'~'9'と英字の'A'~'F'(小文字が有るときはそれも考慮する)

2:数字の時は ASCII-'0'で0~9の値を取得する
英字のときは (ASCII-'A')+10 で10~15の値を取得する

3:あとは上位下位を考慮した処理を行う
上位のデータのときは左に4bitシフト
下位のときは上位のデータとorで合成する

こんな感じでいかがでしょう。
    • good
    • 0

「空白区切りの16進数2桁」と言う前提が崩れないなら



void a2b(char *asc, byte *bin)
{
while (sscanf(asc, "%02X ", bin) == 1) {
asc+=3 ;
bin++ ;
}
}
なんて言うのもありですね。

実現方法はhappy_peopleさんのコードの方が綺麗かな。
("+=3"っていう部分が自分できらい!)

実現方法自体は複数あるのでどうでも良いのですが…。

> happy_peopleさん
ANSI-CではHosted Emvironmentにおいて
・main関数はint型の値を返す
・main関数は0個または2個の引数を取る
と規定されています。
void main(int, char**, char**)
というのは問題ありのコードです。

また、Free Standing Emvironmentではstrtol()関数の存在を期待できません。
    • good
    • 0
この回答へのお礼

お礼が遅れて申し訳ありませんでした。
細かいところまで色々と有難うございました。

お礼日時:2001/03/23 18:36

僕だけかもしれませんが、質問の意味がわかりません。


バイナリデータとは2進数のことなのに16進数?
文字をバイナリに変換?
もともと文字はデータで出来ているのですよ。
まったくバッググランドが見えないのですけれど。。

この回答への補足

すいません。説明不足&間違いです。
ちょっとうまく説明できないので例をあげます。

あるjpegファイルをLANでつないだ2台のマシンを使って一方から他方へコピーする間をパケットアナライザーで見るとします。このアナライザーは取ったパケットデータをテキストに出力します。このテキストデータを読み込んで、パケットヘッダなどの部分を削って画像データの部分だけを抜き出し、ファイルへ出力して元のjpegファイルを再生する、と言ったことをやりたいのです。(行為自体に深い意味はありません)
テキストから読み込んだデータは16進ダンプの表記になっていて、これをどうやってそのままのバイナリデータに変換したらいいか、というのが質問の趣旨です。
アドバイス頂けると幸いです。宜しくお願いします。

補足日時:2001/03/13 21:51
    • good
    • 0

このQ&Aに関連する人気のQ&A

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています

このQ&Aを見た人が検索しているワード

このQ&Aと関連する良く見られている質問

Q文字列からバイナリ変換

C言語で
*argv[]にMacAddress00-0F-1F-16-80-F4などを入力し、
それをバイナリに変換して、int8_t mac_add[6]みたいなものに
代入したいと思っているのですが、
方法がわからず苦戦しております。
宜しくお願い致します。

イメージ
mac_add[0] = 00←バイナリ以下同じ
mac_add[1] = 0F
mac_add[2] = 1F
mac_add[3] = 16
mac_add[4] = 80
mac_add[5] = F4

Aベストアンサー

strtol関数を駆使すれば出来ますね
たとえば以下のような感じ

char mac_add[6];
char *strIn = "00-0F-1F-16-80-F4";
char *p;
int i;
for ( p = strIn, i = 0; i < 6; i++)
{
 mac_add[i] = strtol(p, &p, 16);
 if ( !p || '\0' == *p ) break;
 if ( '-' == *p ) ++p;
}

#てきとーに作成したものなので保証はしません ^^;

Qテキストデータをバイナリデータに変換したい

テキストファイルに以下のデータがあるとします。
テキストデータの中身、

000E6D4181AA,1234567890ABCDEF
0123456789AB,0100000000000000
050505AAAAAA,0200000000000000
070707BBBBBB,0300000000000000
012345CCCCCC,0400000000000000
cdef01DDDDDD,0500000000000000
 ・
 ・
 ・


12桁の数値(16進数)と16桁の数値(16進数)を「,」で区切ります。1行の終端は改行しています。
このテキストファイルにあるデータを以下のバイナリ形式に変換させたいのです。バイナリ形式の各行の16バイト目は、テキストデータにはデータがないので、「00」とします。「,」で区切ったバイナリ形式は「2C」になると思います。
テキストデータの左上から順に「00」は以下の、左上から順の「00」に対応します。

バイナリデータの中身、

00 0E 6D 41 81 AA 2C 12 34 56 78 90 AB CD EF 00
01 23 45 67 89 AB 2C 01 00 00 00 00 00 00 00 00
05 05 05 AA AA AA 2C 02 00 00 00 00 00 00 00 00
07 07 07 BB BB BB 2C 03 00 00 00 00 00 00 00 00
01 23 45 CC CC CC 2C 04 00 00 00 00 00 00 00 00
CD EF 01 DD DD DD 2C 05 00 00 00 00 00 00 00 00
 ・
 ・
 ・


ソースコードでの例、
テキストデータ1行目の1つ目の「,」までのデータ「000E6D4181AA」を、メモリ領域に読み込む。2桁の数値を1バイトで格納する。
つまり、
char buf[6]とすると、
buf[0]=0xAA
buf[1]=0x81
buf[2]=0x41
buf[3]=0x6D
buf[4]=0x0E
buf[5]=0x00
とこのようにメモリに格納したいのです。
格納するバイトオーダーはリトルエンディアン方式とします。


以上で、質問を終わりますが、質問が上手くできていないと思いますので、説明に不備があるかもしれません。その時はお手数ですが、連絡下さい。

テキストファイルに以下のデータがあるとします。
テキストデータの中身、

000E6D4181AA,1234567890ABCDEF
0123456789AB,0100000000000000
050505AAAAAA,0200000000000000
070707BBBBBB,0300000000000000
012345CCCCCC,0400000000000000
cdef01DDDDDD,0500000000000000
 ・
 ・
 ・


12桁の数値(16進数)と16桁の数値(16進数)を「,」で区切ります。1行の終端は改行しています。
このテキストファイルにあるデータを以下のバイナリ形式に変換させたいのです。バイナリ形式の各行の16バイト...続きを読む

Aベストアンサー

/* とりあえず、こんな感じで */
#include <stdio.h>
#include <string.h>
#include <ctype.h>

void main(void){
int c,x;
FILE *fi,*fo;
char table[]="0123456789ABCDEF";

fi=fopen("HexData.txt","r");
fo=fopen("binData.dat","wb");
while(EOF!=(c=fgetc(fi))){
switch(c){
case ',':
fputc(',',fo);
break;
case '\n':
fputc(0,fo);
break;
default:
x=strchr(table,toupper(c))-table;
c=fgetc(fi);
x=x*16+(strchr(table,toupper(c))-table);
fputc(x,fo);
break;
}
}
fcloseall();
}

QCでバイナリデータを変換

今持っているバイナリファイルfile1.x86をテキストファイルfile1.txtに変換したいんですけどうまくいきません。fopenとfreadでバイナリファイルを読み込むところまで入っていると思うんですけど、テキストファイルとして書き出すことができません。

#include <stdio.h>

main()
{
short a[32000];

FILE *infile, *outfile;
infile = fopen("iroha.x86", "r");
outfile = fopen("iroha.dat", "w+");

fread( a, sizeof(short), 32000, infile );
fwrite( a, sizeof(short), 32000, outfile );

fclose(infile);
fclose(outfile);
}

これだとそのまんま出力されるんです。当たり前なんですけど...
どこをどう変えればいいか教えてください。
よろしくお願いします。

今持っているバイナリファイルfile1.x86をテキストファイルfile1.txtに変換したいんですけどうまくいきません。fopenとfreadでバイナリファイルを読み込むところまで入っていると思うんですけど、テキストファイルとして書き出すことができません。

#include <stdio.h>

main()
{
short a[32000];

FILE *infile, *outfile;
infile = fopen("iroha.x86", "r");
outfile = fopen("iroha.dat", "w+");

fread( a, sizeof(short), 32000, infile );
fwrite( a, sizeof(short), 32000, outfile );

fc...続きを読む

Aベストアンサー

No.1の補足より
「32000個の符号つき16ビットバイナリデータを32000個の10進数データとしてテキストファイルに書き込む」ということですよね。

#include <stdio.h>

typedef short _s16bit;

int main(void)
{
  FILE *fi, *fo;
  int  i;
  _s16bit sh_buf[32000];

  fi = fopen("file1.x86", "rb");
  fread(sh_buf, sizeof(_s16bit), 32000, fi);
  fclose(fi);

  fo = fopen("file1.txt", "w");
  for (i = 0; i < 32000; i++) {
    fprintf(fo, "%-6d%c", sh_buf[i], (i%10==9) ? '\n' : ' ');
  }
  fclose(fo);

  return 0;
}

○_s16bitは、お手持ちの環境に合わせ、符号つき16bitの型にtypedefしてください。(まだたいていの環境では大丈夫だと思いますが)
○エラーチェックは、ご自分の責任において組み込んでください。
○ブラウザ上での見易さを考慮し、全角スペースをふんだんに(笑)使ってあります。行頭は全角SP2個でタブ1つに、シングルクォート内は半角SPに変換してからご利用ください。
注)脳内C/C++のコンパイル確認しかしておりません(笑)

No.1の補足より
「32000個の符号つき16ビットバイナリデータを32000個の10進数データとしてテキストファイルに書き込む」ということですよね。

#include <stdio.h>

typedef short _s16bit;

int main(void)
{
  FILE *fi, *fo;
  int  i;
  _s16bit sh_buf[32000];

  fi = fopen("file1.x86", "rb");
  fread(sh_buf, sizeof(_s16bit), 32000, fi);
  fclose(fi);

  fo = fopen("file1.txt", "w");
  for (i = 0; i < 32000; i++) {
    fprintf(fo, "%-6d%c",...続きを読む

Qバイナリデータとテキストデータの違いについて

宜しくお願いします。

バイナリデータを用語辞典で調べると
「テキスト形式(文字データ)以外のデータ形式全般のこと。
実行可能形式のコンピュータプログラムや、画像や音声、
動画などのデータなどがバイナリデータにあたる。」
(http://e-words.jp/w/E38390E382A4E3838AE383AA.html)
とあります。

これでは、バイナリデータとテキストデータの違いが分かりません。

テキストデータはコードの集まりで、
さらに細かくすると0と1の集まり(?)だから・・・
と考えるとバイナリデータとテキストデータの
違いが分かりません。

Q1.私は何が分かっていないのでしょうか?
Q2.バイナリデータとテキストデータの違いを教えてください。

宜しくお願い致します。

Aベストアンサー

バイナリデータは01の集まりです。
テキストデータは文字としての意味が与えられて居ます。ただテキストデータの01としての表現方法はプラットフォーム(OSやアプリケーション)によって異なります。例えば英文字コードでもメインフレームで使われるEBCDICもあり、unixやPCで使われるASCIIもあります。また日本語など英語以外の文字をあらわすのには、さらに多くの種類があります。また改行を表す文字もいろいろです。
例えば telnet で他のコンピュータにログオンして通信する時の文字コードはASCIIで、改行はCRLFと決まっているので、そうでないコンピュータはtelnetプログラムが自分のコンピュータのコード体系と相互変換します。

ftpでテキストデータを転送する時も同じくASCIIとCRLFと決まっています。ただ日本語文字の時にどのコードを使うかは規格では決まっていないので、ftpクライアントで、相手コンピュータの日本語コード種類を指定して、自分と合わなければ転送時に相互変換します。

Cプログラムでもテキストの改行は'\n'と決まっているので、そうでないWindowsの場合はCプログラムとの間でCRLFと'\n'の相互変換が、ライブラリ中で自動的に行われます。

そういった変換を全く行わないのがバイナリデータです。画像ファイルなどはjpegと形式が決まればどのコンピュータでも同じフォーマットなので変換の必要はありません。逆にテキストとみなして変換するとデータが壊れてしまいます。

バイナリデータは01の集まりです。
テキストデータは文字としての意味が与えられて居ます。ただテキストデータの01としての表現方法はプラットフォーム(OSやアプリケーション)によって異なります。例えば英文字コードでもメインフレームで使われるEBCDICもあり、unixやPCで使われるASCIIもあります。また日本語など英語以外の文字をあらわすのには、さらに多くの種類があります。また改行を表す文字もいろいろです。
例えば telnet で他のコンピュータにログオンして通信する時の文字コードはASCIIで、改行はCRL...続きを読む

Qテキストファイルをバイナリファイルに変換

-32768, -32768, -32768, -32768, -32768, -32768, -32768, -32768, -32768,
-32768, 130, 120, 120, 109, 100, 100, 94, 91, 90, 89, 87, -32768, 78, 71,

と続いていくテキストファイルのデータをバイナリデータにC言語で変換したいのですが、どうすれば変換出来るのでしょうか。

Aベストアンサー

大体こんな感じですか?
おそらくtxtをbinに変換したい、変換形式は-32768→8000といった類の変換ですよね。
既にある回答は、16進データが文字列のまま出力されてしまうのでちょっと不便かもしれません。
(フォーマットが%04Xだったら桁数固定なので、それで良いかもしれませんが。)

usage:
./a.out Binary.txt Binary.bin

グローバルで宣言されているByte,Signed,LittleEndianの値をいじって変換形式を変えてみてください。

//-------------------------------------------------

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int Byte=2;
bool Signed=true;
bool LittleEndian=true;

void StrToBinary(char *Str,FILE *fp)
{
int iwt;
unsigned char wBuffer[4];
iwt=atoi(Str);
if(Byte<4 && Signed && iwt>(2<<(Byte*8-1))-1) iwt=(2<<(Byte*8-1))-1;
if(Byte<4 && Signed && iwt<-(2<<(Byte*8-1))) iwt=-(2<<(Byte*8-1));
if(Byte<4 && !Signed && iwt>(2<<(Byte*8))-1) iwt=(2<<(Byte*8))-1;
if(!Signed && iwt<0) iwt=0;
for(int j=0;j<Byte;j++)
{
if(LittleEndian)
wBuffer[j]=((unsigned char *)(&iwt))[j];
else
wBuffer[Byte-j-1]=((unsigned char *)(&iwt))[j];
}
fwrite(wBuffer,1,Byte,fp);

}

int main(int argc,char *argv[])
{
char valBuffer[64];
int i=0;
bool IsInt,IsNumber;
FILE *fp_r;
FILE *fp_w;

if(argc<=2)
{
printf("Invalid parameters.");
return 0;

}else{
fp_r=fopen(argv[1],"r");
fp_w=fopen(argv[2],"wb");
}
if(fp_r==NULL)
{
printf("Read failed. - %s",argv[1]);
return 0;
}
if(fp_w==NULL)
{
printf("Write failed. - %s",argv[2]);
fclose(fp_r);
return 0;
}
i=0;
IsInt=true;
while(!feof(fp_r))
{
valBuffer[i]=fgetc(fp_r);
IsNumber=false;
if(i==0 && valBuffer[i]=='-')
IsNumber=true;
if(IsInt && valBuffer[i]=='.')
{
IsNumber=true;
IsInt=false;
}
if(valBuffer[i]>='0' && valBuffer[i]<='9')
IsNumber=true;
if(IsNumber)
i++;
else{
if((valBuffer[0]!='-' && valBuffer[0]!='.' && i==1) || i>1)
{
valBuffer[i]=0;
StrToBinary(valBuffer,fp_w);
}
i=0;
IsInt=true;
}
}
if((valBuffer[0]!='-' && valBuffer[0]!='.' && i==1) || i>1)
{
valBuffer[i]=0;
StrToBinary(valBuffer,fp_w);
}
fclose(fp_r);
fclose(fp_w);
printf("Conversion succeed. - %s",argv[1]);
return 0;
}

大体こんな感じですか?
おそらくtxtをbinに変換したい、変換形式は-32768→8000といった類の変換ですよね。
既にある回答は、16進データが文字列のまま出力されてしまうのでちょっと不便かもしれません。
(フォーマットが%04Xだったら桁数固定なので、それで良いかもしれませんが。)

usage:
./a.out Binary.txt Binary.bin

グローバルで宣言されているByte,Signed,LittleEndianの値をいじって変換形式を変えてみてください。

//-------------------------------------------------

#include <stdio.h>
#includ...続きを読む

QLNK2019: 未解決の外部シンボルのエラーが出る

Microsoft Visual Studio 2008
Version 9.0.21022.8 RTM
Microsoft .NET Framework
Version 3.5 SP1
----------------------------------------------------------------
新しいプリジェクト→Win32 コンソール アプリケーション(ソリューションのディレクトリを作成 チェック外す)→Windows アプリケーション(空のプロジェクト チェック外す)
----------------------------------------------------------------
 プログラム

 mymain.cpp
#include "myhelper.h"
#include "mymain.h"

//自キャラのデータ
Point2D g_jikipos = {40, 400};//自キャラの座標

//画像ハンドル
int g_jikiimage[11];

//色々なファイルの読み込み
int LoadFiles(){
//画像ファイル読み込み
if(LoadDivGraph("media\\player01.bmp",
11,11,1,64,64,g_jikiimage) == -1) return -1;

return 1;
}


 mymain.h
//他から呼び出させるMyMainの関数
void MyMain();
int LoadFiles();


 myhelper.h(サンプルなので打ちミスはない)
#include "DxLib.h"
#include <limits.h>
#include <math.h>

//構造体宣言
//座標またはベクトルを記録する構造体
struct Vector{
float x,y;
};
typedef Vector Point2D;
//線を記録する構造体
struct Line2D{
Point2D startpos, endpos;
float katamuki;//傾きをラジアン値で記録
Vector speed;//移動している場合は速度をセット
};
//球体を記録する構造体
struct Ball2D{
Point2D position;
float hankei;//半径
};
//四角形を記録する構造体
struct Rect2D{
Point2D lefttop;
Point2D rightbottom;
float width;
float height;
};


//ライブラリ関数
Point2D PosInView(Point2D in);
int XInView(float inx);
int YInView(float iny);
void ScrollToLeft(float jikiposx);
void ScrollToRight(float jikiposx);
void ScrollToUp(float jikiposy);
void ScrollToDown(float jikiposy);
void DrawLineInView(float x1, float y1, float x2, float y2, int Color, int Thickness);
void DrawCircleInView(float x, float y, float r, int Color, int FillFlag);
void DrawAnimation(float x, float y, double ExtRate, double Angle,int TurnFlag,
int *imgarray, int allframe, float fps);
//ベクトル関数
Vector CreateVector(Vector in, float veclen);
Vector AddVector(Vector v1, Vector v2);
Vector SubVector(Vector v1, Vector v2);
Vector AddVectorInFrameTime(Vector pos, Vector speed);
Vector AddVectorInFrameTime2(Vector pos, Vector speed, Vector accel);
Vector Normalize(Vector in);
Vector RotateVector(Vector in, float radian);
float VectorLengthSquare(Vector in);
float DotProduct(Vector v1, Vector v2);
float CrossProduct(Vector v1, Vector v2);
void SetLine2DKatamuki(Line2D *in);
void DrawLine2D(Line2D in, int Color, int Thickness);
void DrawBall2D(Ball2D in, int Color, int Fill);
//当たり判定関数
bool HitTestLineAndBall(Line2D linein, Ball2D ballin);
bool IsPointAtLineFace(Line2D linein, Point2D ptin);
bool HitTestLineAndLine(Line2D line1, Line2D line2);
bool HitTestBallAndBall(Ball2D a, Ball2D b);
bool HitTestPointAndBox(Rect2D rect, Point2D pt);
//タイマー関数
void SetSimpleTimer(int idx, int time);
int GetPassedTime(int idx);


//グローバル変数
extern float g_frametime;
extern Rect2D g_framerect;//画面領域(当たり判定)
extern Point2D g_current_field_pos;//現在の左上座標
extern Rect2D g_stagesize;//ステージサイズ

//定数宣言
const float ZEROVALUE = 1e-10f;
const float PIE = 3.1415926f;
const int SCROLL_LIMIT = 200;
----------------------------------------------------------------
 エラー内容
1>myhelper.obj : error LNK2019: 未解決の外部シンボル "void __cdecl MyMain(void)" (?MyMain@@YAXXZ) が関数 _WinMain@16 で参照されました
1>C:\Documents and Settings\Owner\My Documents\Visual Studio 2008\Projects\my\Debug\my.exe : fatal error LNK1120: 外部参照 1 が未解決です
1>my - エラー 2、警告 0
ビルド: 0 正常終了、1 失敗、0 更新不要、0 スキップ
----------------------------------------------------------------
画像を貼り付けときます
(見えにくい場合→http://www.dotup.org/uploda/www.dotup.org154142.jpg.html)
初心者なのでわかりやすくお願いします

Microsoft Visual Studio 2008
Version 9.0.21022.8 RTM
Microsoft .NET Framework
Version 3.5 SP1
----------------------------------------------------------------
新しいプリジェクト→Win32 コンソール アプリケーション(ソリューションのディレクトリを作成 チェック外す)→Windows アプリケーション(空のプロジェクト チェック外す)
----------------------------------------------------------------
 プログラム

 mymain.cpp
#include "myhelper.h"
#include "mymain.h"

//自...続きを読む

Aベストアンサー

ファイル構成から推測するに
mymain.cpp というファイルに
void MyMain(void) {
// ここに処理を書く
}
という関数が必要なようです。

Qprintf による16進表示について

C言語初心者です。

今作っているプログラムで、データを16進形式で表示しようとしています。
大体このような感じです。

/*入力時*/
char buf[5]={0x4e,0x94,0xa0,0x2b,0x78}

/*出力時*/
for (i = 0; i < 5; i++) {
printf("0x%02x\n",buf[i])
}

実際には入力後にある処理によってbufは更新されるのですが、printfの出力結果として、

0xffffff4e
0x94
0xffffffa0
0x2b
0x78

というように、'ffffff'が付加したものがいくつか出力されてしまいます。
これはどういった意味を持つのでしょうか?

なんか初心者ならではの漠然とした質問ですいません。。。

Aベストアンサー

出力は、
0x4e
0xffffff94
0xffffffa0
0x2b
0x78
ではありませんか?
char が符号付(-128~127)のため、0x80~0xffは負の数とみなされます。printfの引数になる時に 符号付charは符号付intに変換されますが、このCコンパイラの場合は、int が4バイトcharが1バイトのため、上位3バイトに負の数を示すffffffが入ります。
char x=255;
printf("%d\n",x);
だと255でなく、-1が表示されます。

対応としては、
unsingned char buf[5]={0x4e,0x94,0xa0,0x2b,0x78}
;
とするか、
printf("0x%02x\n",buf[i]&0xff);
にするかどちらかですね。

Qファイルやディレクトリの存在確認を行う方法

ファイルをオープンするのはfopenでOKですが、ファイルやディレクトリの存在確認を行う方法が知りたいです。

何か組み合わせて作るものなのでしょうか?
perlとか便利な演算子があるのですが、C/C++って器用ではないですね。
これは処理系?依存の内容ですか?

私の環境は VC6, VC2005 Windows2000です。

Aベストアンサー

int access(const char* path, int mode);
int stat(const char* path, struct stat* sb);

かな?
MSDN を引くと _access_s() を使えとか書いてあるけど。

Qデータ数値を16進文字列でprintfしたい。

Microsoft Visual C++ 2010 Expressでプログラミングしています。

RecvBufという文字列に入った特定の位置の6バイトのデータを取り出したいと思っています。

それで、その6バイトには、TCP通信でアクセスしてきたクライアントのシリアル番号があるので、どのクライアントPCがつながってきたかを識別するため、その6バイト数値を16進数の文字列に変換してprintfで出力したいと思っています。


例えば
RecvBuf[0x08] = 0x00
RecvBuf[0x09] = 0x11
RecvBuf[0x0a] = 0x22
RecvBuf[0x0b] = 0x33
RecvBuf[0x0c] = 0x44
RecvBuf[0x0d] = 0x55

というデータ数値が入っていた場合、これを文字に変換する方法はどのようにしたら良いでしょうか?

Aベストアンサー

「文字に変換する」って, どういうこと?

単に %x で出しちゃいかんの?

Q数値をASCII文字にする方法についての質問です。

数値をASCII文字にする方法についての質問です。

PICマイコンのプログラミングをするために、C言語を使用しています。LCDに数値を表示するには変数を数値ではなく文字で渡してやらないといけないようなのですが、その変換のしかたがわからず調べていると、あるサイトで二桁の数字(suuji)の1の位をASCII文字(hensu)にするために、

hensu = (suuji % 10) + '0';

のようにコードを記載していました。実際にこの通りプログラミングしてみるとLCDに表示されたのですが、なぜこのようにするとASCII文字に変換できるのかがわかりません。('0'を加えるとアスキー文字になるのでしょうか?)どなたか教えて頂ければと思います。

Aベストアンサー

C言語では''(シングルクオート)で括った文字は、その文字を表わす数値(通常はASCIIコード)になることはおわかりですね?
あと、(suuji % 10) がsuujiを10で割った余り(=10進法で1の位の数値)というのも大丈夫ですね?

ASCIIコードでは、0から9までが順番に並んでいます。よって0~9までの数値に'0'を足せば、その数値を表す「数字」になります。
'0'が48(0x30)= 0+48= 0+'0'
'1'が49(0x31)= 1+48= 1+'0'
'2'が50(0x32)= 2+48= 2+'0'
...
'9'が57(0x39)= 9+48= 9+'0'


このQ&Aを見た人がよく見るQ&A

人気Q&Aランキング

おすすめ情報