初心者です。
テキストデータ(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地熱発電などでいう「バイナリ発電」とは

地熱発電などの文献で「バイナリ発電」という言葉がでてきますが、この意味をお教えください。
そもそも、バイナリ発電という場合の「バイナリ」とは、どういう意味で使用されているのでしょうか。

Aベストアンサー

bi---2と言う意味。バイナリ(二進法)、バイリンガル(二ヶ国語)、バイカラー(二色)、バイセクシャル
 水では気体にならないため、より沸点の低い物質を使って蒸気を得るもの。熱交換器が二つ(バイ)ある。

Q10進201、16進C9 のASCIIコードにつきまして。

10進201、16進C9 のASCIIコードにつきまして。

vs2005 c#.net で
int i = 201;
(char)i;
とキャストすると「Ё」

vbにて
hoge = 201
chr(hoge)
と変換すると「ノ」

となります。
この違いはなんなのでしょうか?
また、C#でも「ノ」を出すにはどのようにすればいいのでしょうか?

Aベストアンサー

C#のchar型は16ビット幅のUnicode文字。
Unicodeで16進数のc9はアクセント記号付きのE。
いわゆる半角カナのノはUnicodeでは16進数でff89。
http://www.unicode.org/charts/PDF/U0080.pdf
http://www.unicode.org/charts/PDF/UFF00.pdf

Qアプリのバイナリについて バイナリするにはどうすればよいですか?方法を教えて下さい。

アプリのバイナリについて

バイナリするにはどうすればよいですか?方法を教えて下さい。

Aベストアンサー

バイナリするってなんですか?
バイナリファイルを開きたい?
バイナリファイルの場所を知りたい?

よくわかりません

QVisual Studioで ユニコード "~" が0xff5eと解釈されるが0x301cと解釈してもらいたい。

Visual Studioで ユニコード "~" が0xff5eと解釈されるが0x301cと解釈してもらいたいのですが可能でしょうか?
プログラム中で置き換えるしかないのでしょうか?
そうなると全ての文字に対して0xff5eか調べなくてはならず嫌なのですが。

Aベストアンサー

 前回の補足です。
 windowsはシフトJISの世界です。そして、シフトJISには全角チルダは存在しません。あるのは波ダッシュのみです。ところが、波ダッシュをwindowsの世界でユニコード変換すると全角チルダのコードに変換されてしまいます。キーボードから0x301cに対応する文字を入力する方法はわかりませんが、IMEパッドの文字一覧から0x301cに対応する波ダッシュは入力できます。しかし期待通りに動作するかはわかりません。

なんか上手く説明できなくてごめんなさい。

Q[SQLサーバ&勘定奉行]バイナリ順にしてください!?

こんにちわ。

さて・・・。
SQLサーバがインストールされているPCに勘定奉行を入れようとしました。
勘定奉行はSQLを使うのですが・・・。

エラーメッセージで
「SQLサーバがバイナリ順でないためできません」
「バイナリ順に設定してください」
となります。

SQLサーバ7.0のどこをどうすれば「バイナリ順」に設定変更できますか??

Aベストアンサー

バイナリ順に設定しろというのは、やはりとりあえずSQLサーバのBooksOnlineで「並べ替え順」を検索・参照してみて下さい。この事だと思うのですが...。

Qバイナリデータ処理

VC++6.0初心者です。
バイナリファイルの加工を行いたいのですが、テキスト系のプログラムしか作ったことが無いのでどうすればよいのか分かりません。

やりたいことは、
1、バイナリファイルを開いて2バイトずつ読み込む。
2、"FFD8"がきたら別ファイルにコピー開始。
3、"FFD9"がきたらコピー終了。
です。

大まかな手順がわかりません。
普段、テキストですとCStdioFileを使っていますが、これを使って開いてもよいのかどうかも分かりません(いろいろ調べはしましたがわかりませんでした)。

解決の手がかりやヒントをお教えいただければと思います。よろしくお願いいたします。

Aベストアンサー

確認してません。動かないかも。
エラーチェックも省いてます。
void CHoge::Hoge(LPCTSTR szInFileName, LPCTSTR szOutFileName)
{
  CStudioFile fiHoge;
  CWordArray wArray;
  WORD wBuffer = 0;
  BOOL bCopy = FALSE;
  int nCount = 0;

  wArray.RemoveAll();

  fiHoge.Open(szInFileName, CFile::modeRead | CFile::typeBinary);
  while(1)
  {
    if(fiHoge.Read(&wBuffer, sizeof(WORD)) < sizeof(WORD))
    {
      break;
    }

    if(bCopy == FALSE && wBuffer == 0xFFD8)
    {
      bCopy = TRUE;
    }
    else if(bCopy != FALSE && wBuffer == 0xFFD9)
    {
      bCopy = FALSE;
    }
    else if(bCopy != FALSE)
    {
      wArray.Add(wBuffer);
    }
  }
  fiHoge.Close();

  fiHoge.Open(szOutFileName, CFile::modeWrite | CFile::typeBinary);
  for(nCount = 0 ; nCount < wArray.GetSize() ; wArray++)
  {
    fiHoge.Write(wArray.GetAt(nCount), sizeof(WORD);
  }
  fiHoge.Close();
}

確認してません。動かないかも。
エラーチェックも省いてます。
void CHoge::Hoge(LPCTSTR szInFileName, LPCTSTR szOutFileName)
{
  CStudioFile fiHoge;
  CWordArray wArray;
  WORD wBuffer = 0;
  BOOL bCopy = FALSE;
  int nCount = 0;

  wArray.RemoveAll();

  fiHoge.Open(szInFileName, CFile::modeRead | CFile::typeBinary);
  while(1)
  {
    if(fiHoge.Read(&wBuffer, sizeof(WORD)) < sizeof(WORD))
    {
      break;
    }

  ...続きを読む

Qcgiで表示するhtmlページ内でバイナリ画像を出力したい

cgiで表示するhtmlページ内でバイナリ画像を出力したい

「CGI 画像出力」でググったページで下記のコードがありました。
下記コードは、
Content-typeをimage/gif等にして バイナリを print すれば表示される
という書き方になっていると思いますが、
content-typeがtext/html のページ内でバイナリをprintした場合
バイナリが文字列としてグシャァァァと表示されてしまいます。


-------
$view = 'aaa.jpg';

print "Content-type: image/jpeg\n\n"; #コンテンツタイプを指定する
open IMGG,"$view"; #ファイルハンドル IMGGに画像ファイルを読み込む
binmode (IMGG); #画像なのでバイナリモードに設定する
print <IMGG>; #ファイルハンドルを画面に書き出す
close (IMGG); #ファイルハンドルを閉じる

exit;
-------

content-typeがtext/htmlの状態でバイナリの画像を表示するには
どうすればよいのでしょうか?

cgiを2つ用意して、上記のコードを img src=~~.cgi という形で
呼び出すしかないのでしょうか?

cgiで表示するhtmlページ内でバイナリ画像を出力したい

「CGI 画像出力」でググったページで下記のコードがありました。
下記コードは、
Content-typeをimage/gif等にして バイナリを print すれば表示される
という書き方になっていると思いますが、
content-typeがtext/html のページ内でバイナリをprintした場合
バイナリが文字列としてグシャァァァと表示されてしまいます。


-------
$view = 'aaa.jpg';

print "Content-type: image/jpeg\n\n"; #コンテンツタイプを指定する
open IMGG,"$view"; #ファイル...続きを読む

Aベストアンサー

基本的には、1リクエスト1ファイル返却となりますので、HTMLとJPEGは別々のファイルで返して下さい。

ヘッダー以降に返却されるデータはボディーであり、HTMLの途中からJPEGに変更するってのは反則で通りません。
HTMLの中で単純にバイナリを展開したら無茶苦茶な状態になります。
どうしてもと言うならバイナリをJSコードにして埋めてDOMで再生成とか無茶なやり方は思いつきますが…勧めません。

QASCIIコード表の出力

ASCIIコード表を出力するプログラムを作成中なのですが、
1~32の’BEL’等が実行されてしまいコマンドプロンプト上に表示させることが出来ません。

現在、出力はcntをループさせ、
printf("%d | %c", cnt, cnt);
の様にしております。

よろしくお願いします。

Aベストアンサー

>表示させることが出来ません。

・決めごと(*)ですから・・・。逆に、「表示」できてしまうと、その文字に決めた(割り当てた)「制御」が働かなくなってしまう。
・例えば、cで printf( "\n" );としても改行(\n)してくれないと困りますよね。

★printf()文は、コンソールに【コード】を送っているだけ、たまたまそのコードが、割り当てた「図形文字」だった場合、その【文字】を「表示」する、と考えればいいのでは・・・。

>現在、出力はcntをループさせ、printf("%d | %c", cnt, cnt);の様にしております。

・参考URLのように、「制御文字」部分は、printf( "[%3d][%02X]\n", cnt, cnt);と10進と16進で【コード】そのものを「表示」させたら如何でしょう。

(*)
私は、EBSDICコードが文字コードとしての初物でしたが、まったくASCIIコードとは異なります。一企業(IBM)が決めただけ・・・。

参考URL:http://e-words.jp/p/r-ascii.html

>表示させることが出来ません。

・決めごと(*)ですから・・・。逆に、「表示」できてしまうと、その文字に決めた(割り当てた)「制御」が働かなくなってしまう。
・例えば、cで printf( "\n" );としても改行(\n)してくれないと困りますよね。

★printf()文は、コンソールに【コード】を送っているだけ、たまたまそのコードが、割り当てた「図形文字」だった場合、その【文字】を「表示」する、と考えればいいのでは・・・。

>現在、出力はcntをループさせ、printf("%d | %c", cnt, cnt);の様にしてお...続きを読む

QPHPのfopenのバイナリモードについて

PHPのfopen時のバイナリモードについて質問です。

PHPのマニュアルにはWINDOWSのようなバイナリとテキストモードの形式の違う
システムでは、画像等のバイナリファイルを扱うときはbを付けてバイナリモードで扱うことが推奨されていますが、
WINDOWS環境でためしたところ、画像ファイルをバイナリではなくテキストモードで開いて中身のデータを読み込んで、別名でfopen("~.jpg","w")で書き込んでも、きちんと表示される画像が作成されました。

テキストモードでバイナリファイルを開いても読み込めってさらに、新規でかきこめるなら
なぜ二つのモードが存在するのでしょうか?

ちなみに、WINDOWSにおけるバイナリとテキストモードの違いって改行文字が
¥nか¥r¥nの違いだけでしょうか?
リナックスではバイナリもテキストも中身の改行文字は¥nとなるのでしょうか?

よろしくお願いします。

Aベストアンサー

Windows以外のOSでは、バイナリモードというのはなく、"wb" "rb" も "w" "r" も同じ動作です。Windowsとのソース互換性のため、"b" をつけてもエラーになりません。

Windowsのバイナリモードはそのままファイルを読み込む/書き込む。テキストモードは、"\r\n" を "\n" に変換しながら読み込み、"\n" を "\r\n" に変換しながら書き込む。

Q関数に0を代入??

研究に使うため,C言語のプログラムを読んでいます.
下記のようなプログラムがあるのですが,関数のプロトタイプに0を代入しています,この部分が意味が分からないので,どなたか分かる人がいたら教えてください.

class CLASS{
public:
virtual void setVar (std::string& rcValue) = 0;
};

void ConfigLineChar::setVar( std::string& pvValue )
{
*m_pcPar = (Char)atoi( pvValue.c_str() );
}

不必要な部分は削除して書いています.

Aベストアンサー

 こんにちは。

 純粋仮想関数の事なのでは。
 少なくとも、一つでも其れが付くと抽象クラスとして扱われ、CLASS自体のインスタンスを作成出来なくなり、派生クラス先でその関数をオーバーライドしないといけなくなる筈です。
 
 http://www.bohyoh.com/CandCPP/FAQ/FAQ00078.html
 
 ×この様に作成出来なくなる
 CLASS cls();
 cls.setVar("value");

 ×これも出来ない
 CLASS* pCls = new CLASS();
 pCls->setVar("value");

 ○この様にして使う
 CLASS* pCls = new ConfigLineChar();
 pCls->setVar("value");


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

人気Q&Aランキング

おすすめ情報