JISコードをシフトJISコードに変換します。
- 構文
- JISToSJIS( JIS )
- 引数
- JIS
- 16進数
- 戻値
- シフトJIS(16進数)
プログラム
//////////////////////////////////////////////////
// 【引数】
// JIS : 16進数
// 【戻値】
// シフトJIS(16進数)
//////////////////////////////////////////////////
FUNCTION JISToSJIS(JIS)
DIM arr[1]
DIM res[1]
arr[0] = hexToDec(COPY(JIS, 1, 2))
arr[1] = hexToDec(COPY(JIS, 3, 2))
// 上位8bit
arr[0] = arr[0] - $21
// 上位7bit
res[0] = binToDec(COPY(decToBin(arr[0]), 1, LENGTH(decToBin(arr[0])) - 1))
res[0] = decToHex(res[0] + IIF(res[0] <= $1E, $81, $C1))
// 下位8bit
SELECT COPY(hexToBin(arr[0]), LENGTH(hexToBin(arr[0])))
CASE "0"
res[1] = arr[1] + $1F
IFB res[1] >= $7F THEN
res[1] = decToHex(res[1] + 1)
ELSE
res[1] = decToHex(res[1])
ENDIF
CASE "1"
res[1] = decToHex(arr[1] + $7E)
SELEND
RESULT = JOIN(res, "")
FEND
//////////////////////////////////////////////////
// 【引数】
// bin : 2進数
// 【戻値】
// 10進数に変換した値
//////////////////////////////////////////////////
FUNCTION binToDec(bin)
dec = 0
FOR n = 1 TO LENGTH(bin)
dec = dec + COPY(bin, n, 1) * POWER(2, LENGTH(bin) - n)
NEXT
RESULT = dec
FEND
//////////////////////////////////////////////////
// 【引数】
// dec : 10進数
// 【戻値】
// 2進数に変換した値
//////////////////////////////////////////////////
FUNCTION decToBin(dec)
bin = ""
REPEAT
bin = (dec MOD 2) + bin
dec = INT(dec/2)
UNTIL dec = 0
RESULT = bin
FEND
//////////////////////////////////////////////////
// 【引数】
// dec : 10進数
// 【戻値】
// 16進数に変換した値
//////////////////////////////////////////////////
FUNCTION decToHex(dec)
RESULT = FORMAT(VAL(dec), 0, -1)
FEND
//////////////////////////////////////////////////
// 【引数】
// hex : 16進数
// 【戻値】
// 2進数に変換した値
//////////////////////////////////////////////////
FUNCTION hexToBin(hex)
HASHTBL hb
hb["0"] = "0000"; hb["1"] = "0001";
hb["2"] = "0010"; hb["3"] = "0011";
hb["4"] = "0100"; hb["5"] = "0101";
hb["6"] = "0110"; hb["7"] = "0111";
hb["8"] = "1000"; hb["9"] = "1001";
hb["a"] = "1010"; hb["b"] = "1011";
hb["c"] = "1100"; hb["d"] = "1101";
hb["e"] = "1110"; hb["f"] = "1111";
bin = ""
FOR n = 1 TO LENGTH(hex)
bin = bin + hb[COPY(hex, n, 1)]
NEXT
RESULT = bin
FEND
//////////////////////////////////////////////////
// 【引数】
// hex : 16進数
// 【戻値】
// 10進数に変換した値
//////////////////////////////////////////////////
FUNCTION hexToDec(hex)
dec = 0
hex = STRCONV(hex, SC_LOWERCASE)
FOR n = 1 TO LENGTH(hex)
str = COPY(hex, n, 1)
IFB CHKNUM(str) THEN
num = str
ELSE
num = ASC(str) - 87
ENDIF
dec = dec + (num * POWER(16, LENGTH(hex) - n))
NEXT
RESULT = dec
FEND
//////////////////////////////////////////////////
// 【引数】
// expr : 評価する式
// truepart : 評価した式がTrueのときに返す値
// falsepart : 評価した式がFalseのときに返す値
// 【戻値】
// truepart : 評価した式がTrueのとき、falsepart : 評価した式がFalseのとき
//////////////////////////////////////////////////
FUNCTION IIF(expr, truepart, falsepart)
IFB EVAL(expr) THEN
RESULT = truepart
ELSE
RESULT = falsepart
ENDIF
FEND