- PR -

C#でC言語風の複数文字リテラル(例: 'ABCD')を使用する方法

1
投稿者投稿内容
あぶぽん
大ベテラン
会議室デビュー日: 2005/10/20
投稿数: 205
投稿日時: 2008-01-24 18:51
VS2005Pro C# でスタンドアローンアプリを作っています。

C言語で文字リテラルに複数の文字を入れることができますね。
(例: 'ABCD')※複数文字リテラルというのは僕の造語です(^_^;

C#では文字リテラルはUNICODEなのでそういうことは当然できないのですが、

過去のC資産でこれをやっているところがあり、
なんとかならないものかと思ったのですが、
何てググったらいいか分からず困っています。

最終的にInt32に数値として入れたいのですが、
可読性も考えて'ABCD'の直値を入れるということは避けたいと思います。

byte型とシフト演算で何とかすれば実現できそうですが、
既に方法が分かる方がいらっしゃいましたら教えていただけませんでしょうか?

やはり、"ABCD"(ダブルクォーテーション)で指定して、
byte型に取り出して、シフトとマスクでInt32に入れるという手順でしょうか。

頻繁に呼ばれる(最大0.1秒毎)ので、
どうしても負荷を抑えられない場合は別の方法を取らざるを得ません。

なにか方法はないでしょうか?
Hongliang
ぬし
会議室デビュー日: 2004/12/25
投稿数: 576
投稿日時: 2008-01-24 19:48
string は配列のように各文字(Char 型)にアクセスできますから、それをビット演算が手っ取り早いでしょう。
パフォーマンスに関しては、いまどきの PC ならどんな書き方したってマイクロ秒にもならない程度ですよ。
static readonly にして初期化時に int に変換しておいてもいいですけど。
あぶぽん
大ベテラン
会議室デビュー日: 2005/10/20
投稿数: 205
投稿日時: 2008-01-24 20:50
Hongliangさん、

ありがとうございます。

引用:

string は配列のように各文字(Char 型)にアクセスできますから



そういえば、そういうことができましたね!

すごく、プレーンに書くとこういうことになりますね。

コード:
<C>
    long l32 = 'ABCD';

    printf("Native: 0x%x¥r¥n", l32);


<C#>
    string str = "ABCD";

    byte b1 = (byte)str[0];
    byte b2 = (byte)str[1];
    byte b3 = (byte)str[2];
    byte b4 = (byte)str[3];

    int i32 = b1 << 24 | b2 << 16 | b3 << 8 | b4;

    Console.WriteLine(".NET: 0x" + i32.ToString("x"));



引用:

static readonly にして初期化時に int に変換しておいてもいいですけど。



その案は、設定ファイルをコンストラクタで読み込める場合ならありですね。

コード上に直値で書きたい場合はあまり意味ないですね。
(今回はこっちです)

コード:
    const int ABCD = "0x41424344";



と書くのと同じことですから。。。

上記のプレーンな実装より早い方法があれば知りたいです!

件名からは外れますが、
コレと、文字列の比較に仕様変更するのとどっちが、
速度・保守性の面から上でしょうか?

もしくは、実は、これはイベントIDのようなものなのですが、
C#で標準的な方法ってありますか?

動的なシステムなので、定数を使いたくはないのです。
Azulean
大ベテラン
会議室デビュー日: 2008/01/04
投稿数: 123
お住まい・勤務地: 大阪府
投稿日時: 2008-01-25 01:56
引用:

int i32 = b1 << 24 | b2 << 16 | b3 << 8 | b4;


byte配列ならBitConverter.ToInt32とか。
stringからbyte[]への取り出しならforループで書けますし、もうちょっとすっきりするのでは。

引用:

動的なシステムなので、定数を使いたくはないのです。


コード上で書いた文字列リテラルも十分定数に見えます。


[ メッセージ編集済み 編集者: Azulean 編集日時 2008-01-25 01:57 ]
あぶぽん
大ベテラン
会議室デビュー日: 2005/10/20
投稿数: 205
投稿日時: 2008-01-25 09:23
Azuleanさん、ありがとうございます。

引用:

byte配列ならBitConverter.ToInt32とか。



BitConverter.ToInt32 貴重な情報ありがとうございます。
.NET歴が浅い僕にはぴったりの回答でした。
パフォーマンス検証の対象に入れさせていただきます。

引用:

stringからbyte[]への取り出しならforループで書けますし、もうちょっとすっきりするのでは。



それもパフォーマンス検証に入れさせていただきます。

# 書き忘れていましたが、必ずASCI4文字です。

引用:

引用:

動的なシステムなので、定数を使いたくはないのです。


コード上で書いた文字列リテラルも十分定数に見えます。



本来、良くないのかも知れないです。

ただ、今回はプラグインベースのシステムで、
定数を共通の場所に定義できないので、

数値が重なっても気付きづらいということです。

各プラグイン内で定数定義するのは自由ですが、
それでも、無味乾燥な数値よりもASCI4文字のほうが間違いが少ない
かと思いました。

# もともとのCのシステムもそういう理由で複数文字リテラル(造語)を
# 使っていたのだと思います。
1

スキルアップ/キャリアアップ(JOB@IT)