読者です 読者をやめる 読者になる 読者になる

BitConverterで文字列化したByte配列を復元する方法

暗号化モジュールなどを利用する場合、暗号化後のByte配列の扱いに困ることがあります。Unicodeエンコードした文字列にすると、複合時にうまくいかなかったり…。

ということで、わたしはByte配列をシリアル化して保存する場合、BitConverterを利用しています。

var encrypt = aes.Encrypt(args[1]);
var encryptString = BitConverter.ToString(encrypt);
Console.WriteLine("暗号化文字列:{0}", encryptString);

[実行結果]
暗号化文字列:FF-13-A2-E8-51-5B-C8-75-53-1D-FF-46-28-37-4B-F9

ここまでは簡単ですね。ここから、この16進数をハイフンで連結した文字列をバイト配列に直したいわけです。これができないと、暗号化した文字列を複合することはできません。で、方法は以下の通りです。

/// 
/// BitConverterを使用して文字列へ変換したByte配列を復元します。
/// 
/// 対象の文字列
/// 変換したByte配列
/// が16進数をハイフンで区切った文字列でない場合nullを返します。
public static byte[] ConvertStringToBit(string item)
{
    string itemString = item;

    // ハイフンを含まない場合はNullを返す
    if (!itemString.Contains("-")) return null;

    var array = itemString.Split('-');

    var bytes = new byte[array.Length];
    for (int i = 0; i < array.Length; i++)
    {
        bytes[i] = Convert.ToByte(array[i], 16);
    }

    return bytes;
}

行っている処理は単純で、文字列をハイフンで分解し、分解した各文字列をByte型に変換して配列へ保存しているだけですね。これで、Byte配列を扱う方法に手間取ることはないと思います。

ちなみに、SQL Serverのtimestamp型は.NETFrameworkではByte配列にマッピングされます。ASP.NET MVC3などでView側のHiddenタグに設定する場合も同様な方法で対応しています。何かと便利です。暗号化に限らずいろいろと用途があるのではないでしょうか。