2014年4月23日水曜日

[C#]Shift-jis文字列 <-> JIS7バイト配列 変換

C# でJIS7に変換しているのを紹介しているところが全く無いようで、他の言語を参考にしながら作りました。残念ながら全然理解して作った訳ではないですが、それなりにはちゃんと動いているようです。

        /// <summary>
        /// Shift-jis文字列をJISコードバイト配列に変換
        /// </summary>
        /// <param name="value"></param>
        /// <returns></returns>
        public static byte[] ConvertSjisToJis7(string value)
        {
            var encoding = Encoding.GetEncoding("shift_jis");
            if (value == null)
            {
                throw new ArgumentNullException();
            }
            else if (value.Length != 1 || encoding.GetByteCount(value) != 2)
            {
                throw new ArgumentException("データ長異常");
            }

            var data = encoding.GetBytes(value);
            int high = data[0] <= 0x9F ? data[0] - 0x70 : data[0] - 0xB0;
            high = high * 2 - 1;
            int low = data[1] > 0x7F ? data[1] - 1 : data[1];
            if (low < 0x9E)
            {
                low -= 0x1F;
            }
            else
            {
                low -= 0x7D;
                high += 1;
            }
            data[0] = (byte)high;
            data[1] = (byte)low;
            return data;
        }

        /// <summary>
        /// JISコードをShift-jis文字列変換する
        /// </summary>
        /// <param name="data"></param>
        /// <returns></returns>
        public static string ConvertJis7ToSjis(byte[] data, int startIndex, int length)
        {
            if (data == null)
            {
                throw new ArgumentNullException();
            }
            if (length != 2)
            {
                throw new ArgumentException("データ長異常");
            }

            byte[] sjis = new byte[2];
            Array.Copy(data, startIndex, sjis, 0, length);

            if (sjis[0] % 2 == 1)
            {
                sjis[1] += 0x1f;
            }
            else
            {
                sjis[1] += 0x7d;
            }

            if (sjis[1] >= 0x7f)
            {
                sjis[1]++;
            }

            sjis[0] = (byte)((sjis[0] - 0x21) / 2 + 0x81);

            if (sjis[0] >= 0x9e)
            {
                sjis[0] += 0x40;
            }

            var encoding = Encoding.GetEncoding("shift_jis");
            return encoding.GetString(sjis);
        }

0 件のコメント:

コメントを投稿