
TechNet コラムへようこそ。このコラムでは、よく寄せられるシステム管理スクリプトに関する質問に Scripting Guys がお答えします。システム管理スクリプトについて質問がある場合は、scripter@microsoft.com (英語のみ) までお送りください。すべての質問に回答することはできないかもしれませんが、可能な限り対応いたします。
詳細情報
| • | |
| • | |
| • |
![]()
Scripting Guy さん、よろしくお願いします。2 つの 16 進数値を加算または減算する方法はありますか。
-- PS

PS さん、こんにちは。古いことわざによると、私たちが作成過程を見てはならないものが 2 つあるそうです。それは、法律とソーセージです。Scripting Guys では、このリストに 3 つ目の項目を追加したいと思います。それは、Hey, Scripting Guy! のコラムです。
そう言うと思いました。しかし、皆さんは、完璧な状態に近づけるための調整を重ねてきた完成したコラムを読んでいるということだけは、覚えておいてください。皆さんが、コラムの執筆過程を目にすることはありません。想像できるかどうかはわかりませんが、この過程はお世辞にも職人技と呼べるようなものではありません。
たとえば、次の質問を考えてみましょう。このコラムを執筆している Scripting Guy は、2 つの 16 進数値を直接加算できないことは確信しています。つまり、次のような処理を行うことはできないからです。
hexNumber3 = &H1C8 + &HD201
しかし、彼は 16 進数値を 10 進数値に変換する方法があることを知っていたので動じませんでした。このような情報は役に立つのでしょうか。当然、役に立つはずでした。つまり、2 つの 16 進数値を加算するには、これらの値を同等の 10 進数に変換し、10 進数の値を加算するだけでよいのです。簡単でしょう。
グルーチョ マルクス風に言うなら、このときこの Scripting Guy が切望していたのは子供でした。彼は、Decimal か Dec のような名前の VBScript 関数が必要であると確信していたので、次のようなコードを使用して 16 進数値を変換するために無駄な時間を費やすことになるのです。
intDecimal = Decimal("&H1C8")
彼は救いようがないほど間違った方向に進んでいましたが、彼は諦めるということを知らない人だったので、VBScript ランゲージ リファレンスを参照するという手段に辿り着くまでに、Decimal、Dec、DecToHex を使って相当な数の方法を試しました。「若さの泉」を探し求めたポンセ デ レオンのように、彼は Decimal という名前の関数を探すことに執着していたため、VBScript ランゲージ リファレンスを見ても問題を解決することができませんでした。
このような関数が実在するかどうかもわからないのに、本当に無駄な時間を過ごしました。
数年後、彼の中で何かがひらめき、彼が本当に必要としていた関数に気付きました。そして、ようやく今日のコラムで、そのコードを記述しているのです。
しかし、皆さんが望むのは、私たちのヒーローである Scripting Guys が、この質問を見てすぐに次のスクリプトを記述することだったでしょう。
hexNumber1 = "&H1C8" hexNumber2 = "&HD201" int1 = CLng(hexNumber1) int2 = CLng(hexNumber2) int3 = int1 + int2 Wscript.Echo "Decimal sum: " & int3 Wscript.Echo "Hexadecimal sum: " & Hex(int3)
いつものように、最終的な成果物は非常に簡単です。このスクリプトでは、まず 2 つの 16 進数値を 2 つの変数に割り当てます。変数 hexNumber1 には値 &H1C8 (456) を、変数 hexNumber2 には値 &HD201 (53761) を割り当てます。
hexNumber1 = "&H1C8" hexNumber2 = "&HD201"
特別な処理は何もありません。ここで必要なのは演算対象となる 2 つの 16 進数値だけです。
演算対象の値を取得したら、後はこれらの値を同等の 10 進数の値に変換するだけです。これが、まさに私たちのヒーローが、実在しない関数 Decimal を呼び出して行おうとしていた処理です。おわかりのように、架空の VBScript 関数を使用するよりも、CLng などの実在する VBScript 関数を使用した方が数段優れているのは言うまでもありません。つまり、次のようになります。
int1 = CLng(hexNumber1) int2 = CLng(hexNumber2)
注 : 実際のところ、CLng と Decimal という単語は非常に似ているため、このコラムを執筆した Scripting Guy が混同してしまったことにも理解を示してもらえると思います。きっと、多くの人が日々同じ間違いを犯していることでしょう。 |
16 進数値を同等の 10 進数値に変換したら、この 10 進数値を加算 (減算、乗算、または乗算) します。どうすればよいのでしょう。これには、次のようなコードを使用します。
int3 = int1 + int2
あとは、2 つの 16 進数値の合計を保持している変数 int3 の値を表示するだけです。騙されたと思うかもしれませんが、このサンプル スクリプトでは、10 進数値の合計を表示し、Hex 関数を使用して合計を 16 進数に変換し、その値を表示しただけです。
Wscript.Echo "Decimal sum: " & int3 Wscript.Echo "Hexadecimal sum: " & Hex(int3)
このスクリプトを実行すると、次のようなデータが返されます。
Decimal sum: 54217 Hexadecimal sum: D3C9
注 : 皆さんを非難するつもりはありません。Scripting Guys も彼を信頼していませんから。彼の計算をもう一度チェックするために、電卓を開き、[表示] メニューの [関数電卓] をクリックして、ご自分で数式を入力してみてください。 |
PS さん、よろしいでしょうか。このコラムを書き上げるのには時間がかかったので、この結果にご満足いただければ幸いです。正直に言うと、この質問には、もう少しスムーズに答えられたら良かったと思っています。繰り返しになりますが、このコラムでは、システム管理スクリプトについて説明しています。他の然るべき処理を知っている Scripting Guy がこの記事の執筆を担当していたら、つまらないコラムになっていたと思いませんか。皆さんは、本当に幸運です。