[kagahiro]の検索結果


10進数を2進数文字列に変換する関数は前に作成してますが、逆に「1101」「10110000」などの2進数文字列を10進数の整数値に変換するC言語用の関数がなかったので作成してみました。

#include <stdio.h>
#include <string.h>

int bin2dec(char *src);

int main(void)
{
    char binstr1[] = "1101";     /* 13 */
    char binstr2[] = "10110000";    /* 176 */
    char binstr3[] = "1000000100000000";    /* 33024 */

    int dec = 0;

    dec = bin2dec(binstr1);
    printf("%s:%d(0x%02.2X)\n", binstr1, dec, dec);

    dec = bin2dec(binstr2);
    printf("%s:%d(0x%02.2X)\n", binstr2, dec, dec);

    dec = bin2dec(binstr3);
    printf("%s:%d(0x%02.2X)\n", binstr3, dec, dec);

    return 0;
}

/* 2進数文字列を10進数に変換 */
/* 10000000 -> 128, 1000 -> 8, 1000000000000000 -> 32768 */
int bin2dec(char *src)
{
    int dec = 0;
    for (;;) {
        if (*src == '1') {
            dec |= 1;
        }
        src++;
        if (!*src) {
            break;
        }
        dec <<= 1;
    }
    return dec;
}

実行結果
$ ./bin2dec
1101:13(0x0D)
10110000:176(0xB0)
1000000100000000:33024(0x8100)

[2325] Posted by kagahiro at 2013/07/03 00:10:55
0 point | Link (1) | Trackback (0) | Comment (0)

C言語のstrncpy関数やmemcpy関数ではバイト単位の操作になるので、漢字、ひらがな、カタカナなどの全角文字を文字数で指定して部分文字列を取り出すことができません。 そこで半角英数も全角文字も1文字として部分文字列を取り出すことができる関数を作成します。

以下はそのコードです。[C言語]UTF-8でエンコードされた文字列の文字数を取得するコードと同様に、文字の1バイト目のビットの状態を調べることによってその文字が何バイト文字を判定しています。

#include <stdio.h>
#include <string.h>

char *substr_utf8(char *dest, char *src, int offset, int len);
int _bytesize(unsigned char code);


int main(void)
{
    char *testStr = "ABCDEFGあいうえおアイウエオ愛夢佐々木";
    char strBuf[256];

    memset(strBuf, 0sizeof strBuf);

    printf("substr_utf8($testStr, 0, 5) = %s\n", substr_utf8(strBuf, testStr, 05));
    printf("substr_utf8($testStr, 3, 3) = %s\n", substr_utf8(strBuf, testStr, 33));
    printf("substr_utf8($testStr, 10, 4) = %s\n", substr_utf8(strBuf, testStr, 104));
    printf("substr_utf8($testStr, 13, 5) = %s\n", substr_utf8(strBuf, testStr, 135));

    return 0;
}

/* UTF-8でエンコードされた文字列の部分文字列を取り出す */
/* substr_utf8 (文字列式, オフセット, 長さ)*/
char *substr_utf8(char *dest, char *src, int offset, int len)
{
    int srclen = strlen(src);
    int pos = 0;
    int count = 0;
    char *cp = dest;

    while (pos < srclen) {
        unsigned char code;
        code = *(src + pos); /* ASCIIコード値を取得 */
        int bytelen = _bytesize(code);

        if (count >= offset && count < (offset + len)) {
            memcpy(cp, (src + pos), bytelen);
            cp += bytelen;
            *cp = '\0';
        }
        pos += bytelen;
        count++; /* 文字数をカウント */
    }

    return dest;
}

/* 文字のバイト長を求める */
int _bytesize(unsigned char code)
{
    int size = 1;
    int i;

    if (0x80 & code) { /* 1バイト文字以外 */
        for (i = 2; i <= 8; i++) {
            code <<= 1;
            if (!(0x80 & code)) {
                break;
            }
            size++;
        }
    }
    return size;
}

実行結果
$ ./substr_utf8
substr_utf8($testStr, 0, 5) = ABCDE
substr_utf8($testStr, 3, 3) = DEF
substr_utf8($testStr, 10, 4) = えおアイ
substr_utf8($testStr, 13, 5) = イウエオ愛

[2324] Posted by kagahiro at 2013/07/02 11:02:48
0 point | Link (3) | Trackback (0) | Comment (0)

C言語のstrlen関数では文字列の長さとして返ってくる値はバイト単位となるので、UTF-8でエンコードされている場合、漢字、ひらがな、カタカナなどは1文字で3となってしまいます。

Webアプリケーションのテキスト処理ではそれでは不都合な場合もことも多いので、半角英数も全角文字(漢字、ひらがな、カタカナなど) も1文字としてカウントする関数を作成することにします。

#include <stdio.h>
#include <string.h>

int strlen_utf8(char *cp);
int _bytesize(unsigned char code);

int main(void)
{
    char *testAscii = "ABCDEFG";
    char *testHira  = "あいうえお";
    char *testKata  = "アイウエ";
    char *testKanji = "愛々木";
    char *testAll = "ABCDEFGあいうえおアイウエオ愛夢佐々木";

    printf("strlen(testAscii) = %d\n", strlen(testAscii));
    printf("strlen_utf8(testAscii) = %d\n", strlen_utf8(testAscii));

    printf("strlen(testHira) = %d\n", strlen(testHira));
    printf("strlen_utf8(testHira) = %d\n", strlen_utf8(testHira));

    printf("strlen(testKata) = %d\n", strlen(testKata));
    printf("strlen_utf8(testKata) = %d\n", strlen_utf8(testKata));

    printf("strlen(testKanji) = %d\n", strlen(testKanji));
    printf("strlen_utf8(testKanji) = %d\n", strlen_utf8(testKanji));

    printf("strlen(testAll) = %d\n", strlen(testAll));
    printf("strlen_utf8(testAll) = %d\n", strlen_utf8(testAll));

    return 0;
}

/* UTF-8でエンコードされた文字列の文字数を取得 */
int strlen_utf8(char *cp)
{
    int textlen = strlen(cp);
    int pos = 0;
    int count = 0;

    while (pos < textlen) {
        unsigned char code;
        code = *(cp + pos); /* ASCIIコード値を取得 */
        int bytelen = _bytesize(code);
        pos += bytelen;
        count++; /* 文字数をカウント */
    }

    return count;
}

/* 文字のバイト長を求める */
int _bytesize(unsigned char code)
{
    int size = 1;
    int i;

    if (0x80 & code) { /* 1バイト文字以外 */
        for (i = 2; i <= 8; i++) {
            code <<= 1;
            if (!(0x80 & code)) {
                break;
            }
            size++;
        }
    }
    return size;
}

strlen_utf8関数では、1バイト目のASCIIコード値をパラメータとして_bytesize関数を呼び出して文字のバイト数を求め、1文字分の処理を行うたびに文字数をカウントアップしています。

また、_bytesize関数ではパラメータで渡されたコード値の場合の文字のバイト数を、コード値のビットの状態から判定して戻り値として返しています。

プロクラムの実行結果は以下のようになります。

kagahiro@kagahiro-PC ~/sample/c
$ ./strlen_utf8
strlen(testAscii) = 7
strlen_utf8(testAscii) = 7
strlen(testHira) = 15
strlen_utf8(testHira) = 5
strlen(testKata) = 12
strlen_utf8(testKata) = 4
strlen(testKanji) = 9
strlen_utf8(testKanji) = 3
strlen(testAll) = 52
strlen_utf8(testAll) = 22

[2323] Posted by kagahiro at 2013/07/01 20:46:54
1 point | Link (3) | Trackback (0) | Comment (1)

Unicodeエスケープシーケンスは、\uXXXX(Xは十六進)の6バイトの形でUnicodeの1文字が表される文字の表記方法で、例えば、「あ」という文字はUnicodeエスケープシーケンスで「\u3042」と表記される。Unicode エスケー...
[2322] Posted by kagahiro at 2013/07/01 17:23:39
0 point | Link (1) | Trackback (0) | Comment (0)

Wikibooks(ウィキブックス、 Wiki-textbook を略した名称)は、インターネット上で共同して自由に利用できるオープンコンテントの参考書・教科書を作成してするプロジェクト。プロジェクトで作成される本の著作権は...
[2321] Posted by kagahiro at 2013/07/01 13:21:18
0 point | Link (1) | Trackback (0) | Comment (0)

掲示板CGI ThreadPlus 1.2をリリース(オープンソースライセンス)しました。YouTube動画へのリンクを埋め込みコードに変換する機能、パスを設定して閲覧・投稿を制限する機能、アクセスランキング表示機能が追加され...
[2320] Posted by kagahiro at 2013/06/30 23:52:26
0 point | Link (2) | Trackback (0) | Comment (0)

アンログ.jpは、ブログに簡単に貼り付けることができる無料のレンタルアンケートサービス(アンケートを作成するには、ユーザー登録が必要)。ユーザー登録完了後、調べたいアンケートの「質問」と「選択肢」を設定す...
[2319] Posted by kagahiro at 2013/06/28 11:21:53
0 point | Link (1) | Trackback (0) | Comment (0)

リンクポストという、面白い動画(YouTubeに対応)と画像の情報を共有するために、それらへのリンク(URL)を投稿する掲示板サイトを作りました。動画画像の種類は人物、料理、建物、風景、物体など、なんでも構い...
[2318] Posted by kagahiro at 2013/06/25 10:58:56
0 point | Link (4) | Trackback (0) | Comment (0)

TypeScript(タイプスクリプト)は、Webアプリケーションの開発に広く利用されているJavaScriptに、クラス(Class)やモジュール(Module)となどといった大規模開発に役立つ言語機能を追加したもので、コンパイルに...
[2317] Posted by kagahiro at 2013/06/24 16:47:58
0 point | Link (3) | Trackback (0) | Comment (0)

掲示板などのスレッドやコメント欄に投稿されたYouTube動画のURLを埋め込みコードに変換する方法を、ネットで検索していろいろ調べましたが、YouTube動画のURLは、http://www.YouTube.com/watch?v={VID}とhttp://you...
[2316] Posted by kagahiro at 2013/06/22 01:35:47
0 point | Link (1) | Trackback (0) | Comment (0)

|< 先頭へ  < 前へ  96 97 98 99 100  次へ >


アクセスランキング

今日のアクセスランキング TOP 10

  1. CGIから利用できるPerlモジュールを調べるには (4 PV)
  2. FC2まとめ (3 PV)
  3. MT4向け1ポジブレイクアウトEA「HEADLINE」オープンソースライセンス(GPL3)で公開 #USDJPY (2 PV)
  4. Microsoft Cognitive Toolkit - オープンソースの深層学習ツールキット#機械学習 #プログラミング (1 PV)
  5. FC2動画 - 映画、ドラマ、アニメなどが無料で見られる動画共有サイト (1 PV)
  6. UNIX 書籍 (1 PV)
  7. IPA「安全なSQLの呼び出し方」を公開 (1 PV)
  8. MT4向けヘッジEA「Balancer X Ver 1.01(使用期限 2022年06月30日 23時59分)」 #システムトレード (1 PV)
  9. 将棋ウォーズPCブラウザ版がchrome、Firefox、edgeなどに対応 (1 PV)
  10. Googleが過去最大級のアップデートを発表―セマンティック検索実現へ大きく一歩踏み出す (1 PV)

今月のアクセスランキング TOP 10

  1. CGIから利用できるPerlモジュールを調べるには (4 PV)
  2. FC2まとめ (3 PV)
  3. 有力将棋系ユーチューバーのショウヤンさんが将棋ウォーズで「ソフト指し」を告白し衝撃走る (3 PV)
  4. 爆益を狙うハイリスクハイリターンのナンピンマーチンEA「Hyper Dollar MT5」 (3 PV)
  5. SQLiteのSELECT文で上位 (TOP) n件のデータを取得する (3 PV)
  6. 安全性重視の完全無料ナンピンマーチンEA「Million Dollar(ミリオンダラー)」 #FX #ゴールド #ビットコイン (3 PV)
  7. Googleがプロパティランキングで初のトップ10入り (2 PV)
  8. 量的緩和(りょうてきかんわ) (2 PV)
  9. [PR]noteで販売している自作EAの一覧 (2 PV)
  10. 自作のMT4向け無料EA(口座縛り無し、ブローカー縛り無し、使用期限無し)とゴゴジャン出品中の有料EAの一覧 #MT4 (2 PV)

アクセス統計

ディレクトリ

関連サイト