
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がインテルでもモトローラでも同じになります。
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);
> これだと問題ありでしょうか?
そんな質問はまず自分で試してから。
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;
}
この回答への補足
ご回答ありがとうございます。
上記の方法で試したところ、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);
> で可能だと思いますが、
ぜんぜん違います。 やってみてください。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- C言語・C++・C# c言語 int temp = 0; if(isdigit(arr[i])){ temp=arr[i] 2 2022/03/27 01:44
- C言語・C++・C# C言語について コマンドラインで >変数 12.00 (char型) と、小数点付きの値を共用体に渡 1 2022/04/22 16:56
- C言語・C++・C# C言語 共用体について コマンドライン引数で値を2つ入力したときに、argv[2]の値をUNI u1 4 2022/04/25 20:34
- その他(コンピューター・テクノロジー) 【Tableau Desktop】文字列から8桁の数字を日付型(yyyyMMdd)として取得 1 2023/07/31 10:17
- フリーソフト フォルダ、ファイル名の一括変換について 3 2023/03/16 09:23
- Visual Basic(VBA) 複数のcsvファイルをExcelに一括変換したい 2 2023/03/03 12:44
- XML MSFormsとは何ですか? 2 2022/05/02 09:38
- C言語・C++・C# C言語初心者 構造体 課題について 2 2023/03/10 19:48
- Excel(エクセル) フォルダ階層が深いファイルの拡張子の一括変換 2 2022/12/23 18:40
- Visual Basic(VBA) いつもお世話になっております、VBAで教えて頂きたいのですが 2 2022/05/05 22:20
このQ&Aを見た人はこんなQ&Aも見ています
-
CStringからchar*への型変換について教えてください。
C言語・C++・C#
-
unsigned char配列への入力の仕方
C言語・C++・C#
-
long型のデータをバイト型の配列に代入する方法
C言語・C++・C#
-
-
4
DWORDの実際の型は何でしょうか
C言語・C++・C#
-
5
unsigned long long 型のフォーマット指定子
C言語・C++・C#
-
6
文字列の途中から途中までを抽出
C言語・C++・C#
-
7
CString から LPCTSTRの型に変換
C言語・C++・C#
-
8
VC++におけるCStringの変換
C言語・C++・C#
-
9
構造体のメンバをfor文で回したい
C言語・C++・C#
-
10
メッセージハンドラ
C言語・C++・C#
-
11
既定のコンストラクタがありません。というエラーについて
C言語・C++・C#
-
12
0xffffとは?
C言語・C++・C#
-
13
TCHAR文字列内の検索について
C言語・C++・C#
-
14
数値をASCII文字にする方法についての質問です。
C言語・C++・C#
-
15
「#undef」と「#define」の使い方について
C言語・C++・C#
-
16
読み込み中にアクセス違反が発生しました、と出ます。これを回避することは
C言語・C++・C#
-
17
double型の値をchar配列に変換する方法はありますか?
C言語・C++・C#
-
18
適切な変換関数が存在しない???
C言語・C++・C#
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
テキストデータをそのままバイ...
-
CStringをwchar_tに変換したい
-
文字列から空白を取り除きたい...
-
c言語でユーザ関数を利用して入...
-
fgetsなどのときのstdinのバッ...
-
double型の値をchar配列に変換...
-
ネットワークにつながっている...
-
2曲同時再生するにはどうした...
-
char型からのバイト数取得
-
型変換
-
recvfrom関数の戻り値がおかし...
-
絶対パスからのファイル名の切...
-
C言語です
-
c++ 文字列を入力して、一文字...
-
C言語の入力した文字を反転させ...
-
3桁区切(コンマ)記号をつけ...
-
間接操作のレベルとは
-
DPマッチング
-
配列をnビットシフトする
-
strtokについて
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
fgetsなどのときのstdinのバッ...
-
文字列から空白を取り除きたい...
-
間接参照のレベルが異なっています
-
C言語のfor文です。 繰り返しの...
-
CStringをwchar_tに変換したい
-
テキストデータをそのままバイ...
-
charからLPTSTRへの変換方法
-
atoi( ) の反対をやりたい
-
charでの計算?
-
配列をnビットシフトする
-
c++ 文字列を入力して、一文字...
-
'const char *' 型は 'char *' ...
-
c言語でユーザ関数を利用して入...
-
干支のプログラム
-
switch文で文字を比較すること...
-
char型からのバイト数取得
-
ネットワークにつながっている...
-
getchar()を int でとる理由...
-
間接操作のレベルとは
-
str系関数を使わずに二つの文字...
おすすめ情報