10進数の数値とn進数の文字列を相互変換するAppleScriptです。
もともと、AppleScriptの言語仕様上、10進数とn進数文字列との相互変換機能は存在しないのですが、サードパーティから機能拡張書類(OSAX)でそのような機能が提供され、さらにClassic MacOSからMac OS Xへの移行時にそれらの機能拡張書類が使えなくなって(一部は移行)、個別にそれらの機能をスクリプター側で実装してMailing ListやBBS上、Blogなどで共有してきたという経緯があります。
AppleScript Users MLに流れていたもののような気がしますが、自分で作ったものかもしれません。出どころ不明です。
ただ、2進数変換や16進数変換などの各種変換ルーチンが乱立していたところに、「これ、全部1つで済むんじゃね?」と思ってまとめたような気がしないでもありません。自分で作っても簡単なので。
Cocoaの機能を一切使っていません。たしかにCocoaの機能を用いての変換も行えるのですが、データのサイズがとても小さい(桁数が少ない)ので、Cocoaの機能を呼び出さないほうが高速です。
もしも、AppleScriptの予約語のようにこれらの機能を呼び出したい場合には、これらのScriptをAppleScript Librariesにして、AppleScript用語辞書をつけて書き出せば(辞書はなくても大丈夫ですが)、
use nthLib: script "nThConvLib"
のように呼び出すことができるようになっています(macOS 10.9以降)。
AppleScript名:10進数をn進数文字列に変換する |
set a to 100
–10進→16進数変換 set b to aNumToNthDecimal(a, 16, 4, {"0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "A", "B", "C", "D", "E", "F"}, true) of me –> "64" –10進→8進数変換 set c to aNumToNthDecimal(a, 8, 4, {"0", "1", "2", "3", "4", "5", "6", "7"}, true) of me –> "144" –10進→2進数変換 set d to aNumToNthDecimal(a, 2, 8, {"0", "1"}, false) of me –> "01100100" –10進数をn進数文字列に変換する –origNum:変換対象の数字 –nTh: n進数のn –stringLength: 出力指定桁(上位桁のアキはゼロパディングされる) –zeroSuppress: 上位桁がゼロになった場合に評価を打ち切るかのフラグ、ゼロパディングを行わない(ゼロサプレスする)場合に指定 on aNumToNthDecimal(origNum, nTh, stringLength, stringSetList, zeroSuppress) set resString to {} repeat with i from stringLength to 1 by -1 if {origNum, zeroSuppress} = {0, true} then exit repeat set resNum to (origNum mod nTh) set resText to contents of item (resNum + 1) of stringSetList set resString to resText & resString set origNum to origNum div nTh end repeat return (resString as string) end aNumToNthDecimal |
AppleScript名:n進数文字列を10進数に変換する v2a |
–2進数文字列→10進数数値変換 set a to "11" set b to aNthToDecimal(a, {"0", "1"}) of me –> 3 –8進数文字列→10進数数値変換 set a to "144" set c to aNthToDecimal(a, {"0", "1", "2", "3", "4", "5", "6", "7"}) of me –> 100 –16進数文字列→10進数数値変換 set a to "64" set b to aNthToDecimal(a, {"0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "A", "B", "C", "D", "E", "F"}) of me –> 100 –n進数文字列を10進数に変換する on aNthToDecimal(origStr as string, nTh as list) set resNumber to 0 set sList to reverse of (characters of origStr) set aLen to length of nTh set digitCount to 0 repeat with i in sList set j to contents of i set aRes to (offsetInList(j, nTh) of me) set resNumber to resNumber + (aLen ^ digitCount) * (aRes – 1) set digitCount to digitCount + 1 end repeat return resNumber as integer end aNthToDecimal –元はCocoaの機能を利用していたが、処理対象のデータが小さいのでOld Style AppleScriptで書き直した on offsetInList(aChar as string, aList as list) set aCount to 1 repeat with i in aList set j to contents of i if aChar is equal to j then return aCount end if set aCount to aCount + 1 end repeat return 0 end offsetInList |
More from my site
(Visited 74 times, 1 visits today)