JISToSJIS

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