• ベストアンサー

型変換

こんにちは。 long型およびunsigned long型を unsigned char型へ変換する方法を教えてください。 例えば、long型をchar型へ変換するには sprintf(pchar, "%s", &longvalue); で可能だと思いますが、冒頭の変換は sprintfだと1番目の引数の型が違うようで うまくいきません。 よろしくお願いします。

質問者が選んだベストアンサー

  • ベストアンサー
  • rentahero
  • ベストアンサー率53% (182/342)
回答No.6

そもそも、longをunsigned charに変換するといっても、どうすることを想定しているかによって回答は変わります。 1.キャスト long型の159(数値の159=0x0000009f)をunsigned char型の159(数値の159='0x9f')にする long型の257(数値の257=0x00000101)をunsigned char型の1(数値の1=0x01)にする signed long型の-1(数値の-1=0xffffffff)をunsigned char型の255(数値の255=0xff)にする 2.文字列へ変換 long型の159(数値の159=0x0000009f)をunsigned char型の"159"(文字列の"159"='1''5''9''0x00')にする 3a.バイトオーダ(リトルエンディアン) long型の305419896(数値の305419896=0x12345678)をchar型配列の'0x78''0x56''0x34''0x12'にする 3b.バイトオーダ(ビッグエンディアン) long型の305419896(数値の305419896=0x12345678)をchar型配列の'0x12''0x34''0x56''0x78'にする 4.バイトオーダ(ネットワークバイトオーダ) long型の305419896(数値の305419896=0x12345678)をchar型配列の'0x12''0x34''0x56''0x78'にする 上記の各パターンで方法がそれぞれ違います。 int i; long l; long nl; unsigned char uc; char *cp; unsigned char *ucp; unsigned char ucbuf[16]; 1.uc = (unsigned char)l; 別に明示的にキャストしなくても、暗黙のキャストにより結果は同じだが、明示的にキャストしたほうが読み間違えたりしないでしょう。 2.sprintf(ucbuf, "%ld", l); sprintfはそれほど速くないが、頭を抱えるほど遅いわけでもないのでよいでしょう。 コード例は以下 l=159; sprintf(ucbuf, "%ld", l); printf(ucbuf, "ucbuf := %s\n", ucbuf); for(i=0;i<16;i++) { printf("ucbuf[%d] := 0x%x\n", i, ucbuf[i]); if(ucbuf[i] == 0x00) break; } 結果: ucbuf := 159 ucbuf[0] := 0x31 ucbuf[1] := 0x35 ucbuf[2] := 0x39 ucbuf[3] := 0x0 3.ホストバイトオーダ これは、CPUのエンディアンに依存します。 コード例は以下 インテル系(リトルエンディアン) l=0x12345678; ucp = (unsigned char *)&l; for(i=0;i<sizeof(long);i++) printf("ucp[%d] := 0x%x\n",i , ucp[i]); 結果: ucp[0] := 0x78 ucp[1] := 0x56 ucp[2] := 0x34 ucp[3] := 0x12 モトローラ系(ビッグエンディアン) l=0x12345678; ucp = (unsigned char *)&l; for(i=0;i<sizeof(long);i++) printf("ucp[%d] := 0x%x\n",i , ucp[i]); 結果: ucp[0] := 0x12 ucp[1] := 0x34 ucp[2] := 0x56 ucp[3] := 0x78 ネットワークバイトオーダ(ビッグエンディアン)*1 #include <sys/param.h> l=0x12345678; nl = htonl(l); ucp = (unsigned char *)&nl; for(i=0;i<sizeof(long);i++) printf("ucp[%d] := 0x%x\n",i , ucp[i]); 結果: ucp[0] := 0x12 ucp[1] := 0x34 ucp[2] := 0x56 ucp[3] := 0x78 *1 ネットワークバイトオーダはCPUがインテルでもモトローラでも同じになります。

その他の回答 (5)

  • kaha
  • ベストアンサー率23% (41/177)
回答No.5

> b=a; ←このままではだめですよね… union{ unsigned char tmp[sizeof(long)]; long a; }; a=50; > long型をchar型へ変換するには これは「long型をバイト単位で分解するには」ですよね?

回答No.4

> ...C++ソースですと、 >「1番目の引数を'unsigned char [100]'から'char *'に変換できません。」 > というコンパイルエラーが出てしまいます。 sprintf(reinterpret_cast<char*>(temp), "%ld",50L); > unsigned char temp[100]; > long a= 50; > memcpy(temp, &a, (size_t)a); > これだと問題ありでしょうか? そんな質問はまず自分で試してから。

  • lawson
  • ベストアンサー率44% (29/65)
回答No.3

>long型およびunsigned long型を >unsigned char型へ変換する方法を教えてください。 はNo1さんの回答が答えを見るとして。 >追加の質問で申し訳ないのですが、 >同様にcharの配列型に変換するにはどうすればよいで>しょうか。 >long a; >unsigned char b[10]; >b=a; ←このままではだめですよね… >すみませんが、よろしくお願いします。 これについては 以下のソースが答えです。 #include<stdio.h> int main(int argc, char** argv) { unsigned char temp[100]; sprintf(temp, "%ld", 50L); printf("%s\n", temp); return 0; }

kerberos_001
質問者

補足

ご回答ありがとうございます。 上記の方法で試したところ、Cソースではコンパイルが通るのですが、C++ソースですと、 「1番目の引数を'unsigned char [100]'から'char *'に変換できません。」 というコンパイルエラーが出てしまいます。 unsigned char temp[100]; long a= 50; memcpy(temp, &a, (size_t)a); これだと問題ありでしょうか?

回答No.2

> 例えば、long型をchar型へ変換するには > sprintf(pchar, "%s", &longvalue); > で可能だと思いますが、 ぜんぜん違います。 やってみてください。

  • tatsu99
  • ベストアンサー率52% (391/751)
回答No.1

単純に転送すれば良いです。 long a; unsigned char b; b=a; でOKです。 但し、bは0~255までしか、格納できませんので 転送もとのaも0~255迄の範囲でないと、期待した結果は得られません。

kerberos_001
質問者

補足

ご回答ありがとうございます。 追加の質問で申し訳ないのですが、 同様にcharの配列型に変換するにはどうすればよいでしょうか。 long a; unsigned char b[10]; b=a; ←このままではだめですよね… すみませんが、よろしくお願いします。

関連するQ&A

  • C言語の型変換について

    short int 型をunsigned char型に変換する方法をおしえてください

  • 暗黙的型変換

    C の文法書を読んでいると、 汎整数型拡張: int より小さな汎整数型が式中に現れる場合は、暗黙的に int 型に変換される。 算術変換: 二項演算子で二つのオペランドの型が違う場合は、演算前により大きな方の型に暗黙的に変換される。 とあります。 例えば int 型 = unsigned short 型 - unsigned char 型; はどのように暗黙的な型変換が行われるのでしょう。 int 型 = (int)unsigned short 型 - (int)unsigned char 型; でしょうか。あるいは、 int 型 = (int) ( unsigned short 型 - (unsigned short)unsigned char 型); でしょうか。

  • c言語 型変換について

    c言語 型変換について 下記のように文字コードは、unsigned int型('B')をunsigned char 型(str[1] ) 格下げする型変換する規則を教えてください。 *質問ソースプログラム: int main(void) { char str[4]; /* 文字列を格納する配列 */ str[0] = 'A'; /* 代入 */ str[1] = 'B'; /* 代入 */ ・・・・・・ printf("size B %u\n",(unsigned)sizeof('B')); printf("size str[1] %u\n",(unsigned)sizeof(str[1])); * 実行結果 size B 4 size str[1] 1

  • error C2664

    現在VisualStudio C++ 6.0にてプログラムを組んでいるのですが、以下のようなエラーが出ます。 型の変換ができていないであろうことはわかるのですが、解決方法がわかりません。 どのような解決方法があるのでしょうか? よろしくお願いします。 error C2664: 'strcat' : 1 番目の引数を 'unsigned char [256]' から 'char *' に変換できません。 (新しい機能 ; ヘルプを参照) 指示された型は関連がありません; 変換には reinterpret_cast、 C スタイル キャストまたは関数スタイルのキャストが必要です。

  • 汎整数拡張の通常の算術型変換

    「汎整数拡張」の「通常の算術型変換」に <一方のオペランドが型unsigned long intをもつ場合、他方のオペランドをunsigned long intに型変換する。> この下に「そうでない場合」が、一方のオペランドが型long intをもつ場合が二つ続きます。 <一方のオペランドが型unsigned intをもつ場合、他方のオペランドをunsigned intに型変換する。> <>2つの例はlong型やint型よりもunsigned型の上位に位置づけています。 例として   if(-1<1u)は偽になります。 何ゆえにunsigned型の上位性をしているのでしょうか。宜しく願います。

  • C++型変換について

    C++を始めたばかりの初心者です VBからstringの引数をもらって C++のdllで処理をしてstringを返すものを考えています dll内で処理をするのにstd::stringに変換したいのですが 変換ほうほうがわかりません charをstd::stringへ std::stringをcharへの変換方法を教えてください 宜しくお願いします。

  • string型とsbyte*型の変換

    現在、C++で作成したクラスを、 C#から呼び出し実行しようとしております。 C++側での引数のデータ型は、「char *」 、 C#側での引数は、「sbyte*」となっています。 このクラスに対し、C#側から文字列をC++側に渡したい場合、 string型からsbyte*型へ変換しなければならないと 考えているのですが、その方法がわかりません。 そもそもの考え方が正しいのかどうかもわからない状態ですので、 質問そのものがとんちんかんなことを聞いているのかも知れませんが、 どうぞよろしくお願いいたします。

  • 暗黙の型変換をやめたい

    ASP.NET(C#2.0)からSQLServer2008R2のストアドプロシージャをコールする際、暗黙の型変換を使うとパフォーマンスが落ちるらしいので、全て明示的な型変換に修正したいと思っています。 MySQLをselectした値をリーダー(reader)に格納し、SQLServerにストアドコール時にパラメータ指定してinsertするのですが、何が暗黙的で何が明示的なのかわかりません。 下記は引数1にパラメータ、引数2にDBType(省略可)、引数3に値を指定しています。 [暗黙的かと思われるパラメータの渡し方] AddParameter("@パラメータ1", reader["値1"]); //char(2) AddParameter("@パラメータ2", DbType.string, reader["値2"].ToString()); //nvarchar(20) [明示的かと思われるパラメータの渡し方] AddParameter("@パラメータ3", DbType.DateTime, Convert.ToDateTime(reader["値3"])); //datetime AddParameter("@パラメータ4", DbType.Currency, (Convert.ToDecimal(reader["値4"])) * 100); //money 暗黙の型変換とは、引数3の型を指定しない場合に起こるという認識で合っていますでしょうか?

  • C++型変換

    型変換が難しいです。 デバッグやフォームへ文字を表示するのに型変換で躓いています。 charからstringとやBYTEからstringなど相互変換の需要はあまりないのでしょうか? char2stirngとか一式どこかにないですか? そもそもMicrosoftがこう言った型変換を簡単にするのを提供しないのはなぜでしょう? VBはあまり意識せずできていたので、VBからするとメッセージボックスに文字や数字を出すだけでも一苦労です。

  • CStringからchar*への型変換について教えてください。

    以前の質問に int型 → CString型/char型 がありましたが、 CString型をchar*型に変換する方法を 教えていただければありがたいです。 MSDNで「LPCTSTRキャスト」が説明されていましたが、 例が載ってないのでよくわかりませんでした。 よろしくお願いします。

専門家に質問してみよう