文字列を 16 進数にする

iPhone を購入した際に fon の無線 LAN ルーターを入手して、しばらく WPA の認証を使っていたのですが、Wii や DS などのゲーム機器と繋げるために WEP に変更することにしました。

しかも、この際の WEP Key は fon ルーターに対して文字列を 16 進数で入力する必要があるため、この変換を行うスクリプトを awk で作ってみました。

ord() 関数は AWK Users JP :: シーザー暗号 で用いた gawk に付属のものを用い、16 進数への変換は AWK Users JP :: 10 進数を N 進数に基数変換する で用いた基数変換を用いています。 組み合わせで作られているため、少し長いコードになってしまいました。

#! /usr/local/bin/gawk -f
# str_to_16.awk
# 文字列を 16 進数に変換する
# usage: gawk -f str_to_16.awk str

BEGIN {

    str = ARGV[1];

    print str_to_16(str);
}

# str_to_16():  文字列を 16 進数に変換する
#   in:     文字列 str
#   out:    文字列 str を 16 進数にしたもの
function str_to_16(str,    i, new_str) {
    for (i = 1; i <= length(str); i++) {
        new_str = new_str conv_base_num(ord(substr(str, i, 1)), 16);
    }

    return new_str;
}

# ord() と chr() 関数
# Ref.: /usr/share/awk/ord.awk
function _ord_init(    low, high, i, t) {
    low = sprintf("%c", 7)                  # BEL is ascii 7

    if (low == "\a") {                      # regular ascii
        low = 0;
        high = 127;
    } else if (sprintf("%c", 128 + 7) == "\a") {
        # ascii, mark parity
        low = 128;
        high = 255;
    } else {                                # ebcdic(!)
        low = 0;
        high = 255;
    }

    for (i = low; i <= high; i++) {
        t = sprintf("%c", i);
        _ord_[t] = i;
    }
}

function ord(str,    c) {
    _ord_init();
    # only first character is of interest
    c = substr(str, 1, 1);
    return _ord_[c];
}

function chr(c) {
    # force c to be numeric by adding 0
    return sprintf("%c", c + 0);
}

# conv_base_num - convert decimal number to another base number
function conv_base_num(num, base,    rem, str, base_str, arr_base_str) {

    base_str = "1 2 3 4 5 6 7 8 9 A B C D E F G H I J K L M N O P Q R S T U V W X Y Z";
    split(base_str, arr_base_str);

    while (num > 0) {
        rem = int(num % base);

        if (rem == 0) {
            str = "0" str;
        } else {
            str = arr_base_str[rem] str;
        }
        num = int(num / base);
    }

    return str;
}

実行してみましょう。

$ gawk -f str_to_16.awk foobarbuzhoge
666F6F62617262757A686F6765

こんな風にして 16 進数に変換したものを fon のルーターの WEP Key に入れてやれば OK です。 これで我が家の iPhone とゲーム機器は無線 LAN で結ばれることになりました。

自宅サーバーのため DHCP で IP アドレスを割り当てているわけではない関係上、それぞれのデバイスに IP アドレスを割り当てる必要があり、(こういう時に限って Wii のカーソルが飛びまくって) こちらの方が面倒でした。

tag_gawk.png tag_gawk.png