Shammer's Philosophy

My private adversaria

C

16進数を2進数で表示させる

C

C言語で2進数を表示させる・改 - Shammerismで言及した関数を書いた。 #include <stdio.h> #include <stdlib.h> #include <string.h> void print_as_b_value(const long value){ unsigned long bit = (1L << (sizeof(long) * 8 - 1)); int i = 0; int x = 0; for( ; bit != 0 ; bit >>= 1,</string.h></stdlib.h></stdio.h>…

C言語で2進数を表示させる・改

C

C言語で2進数を表示させる - Shammerismの内容を少し変更。左の0は表示させないようにしたのと、引数をlong型に変更。 void print_as_b_value(const long value){ unsigned long bit = (1L << (sizeof(long) * 8 - 1)); int i = 0; int x = 0; for( ; bit !=…

16進数を10進数に戻す関数

C

16進数を10進数に戻す関数-20130202 - Shammerismでも同じタイトルの記事を書いた。以前はLispで書いたが、今回はC言語。文字列の反転 - Shammerismで作成したreverse_stringも使用する。 void hex_to_decimal(char *value){ int i = 0; int n; int base = 1…

文字列の反転

C

文字列を反転させる標準関数を見つけることができなかったので自作。 char* reverse_string(char* value){ if ( strlen(value) < 2 ) { return value; } else { char *result = malloc(strlen(value) - 1); int i, j; for( i = 0, j = strlen(value) - 1 ; i …

C言語で2進数を表示させる

C

Cで書かれたコードの中には、よくシフト演算や論理演算を使用するものがある。しかし、Cにそんなに強くない自分としてはそのようなコードを読んでも理解が難しい。そこで、サンプルのコードを2進数で見てみれば理解しやすくなるのではないか、と考えてprintf…

動的ローディングのサンプルコード

C

三つのリンク方式 - Shammerismで動的ローディングのコードを書いていなかったので、それを実装。と言っても、http://www.amazon.co.jp/C言語による-スーパーLinuxプログラミング-Cライブラリの活用と実装・開発テクニック-飯尾-淳/dp/4797361204で紹介され…

三つのリンク方式

C

C言語では、mainプログラム、というかmain function から実行される。通常のプログラムは、main のみで収まるサイズではないので、main 以外の関数に処理を小分けして、それを順番に呼び出すことで実行していく。しかし、その小分けされた関数でも数が多くな…

アセンブラコードまで展開してみる

C

gcc のオプションで -S というものがある。これを使用すると、アセンブラまで展開してくれて、拡張子 .s のファイルができる。当然だが、この拡張子 .s のファイルをコンパイルして実行コードを生成することも可能。 $ ls test.c $ gcc -S test.c $ ls test.…

Autotoolset を使ってみる

Tarball からビルドする際、呪文のように ./configure make make install を実行しているが、この形式でインストールが可能にしてくれるのがAutotoolsetというもの。ちょっとだけ試しに使ってみる。 実行ファイルの用意 #include <stdio.h> int main(){ printf("Hello</stdio.h>…

システムで定義されたマクロを確認する方法

C

以下のようにすることで確認できる。 $ echo | cpp -dM #define __DBL_MIN_EXP__ (-1021) #define __UINT_LEAST16_MAX__ 65535 .....Cのソースは、OS などのプラットフォームが変わっても問題なくコンパイルできるように、環境ごとに展開されるコードを変え…

include の動きを確認してみる

C

gcc の -e というオプションを使うと、プリプロセッサがどのようにソースコードを変更したのかを確認することができる。例えば、以下のような sub.c というソースを int func1(){ return 0; } main.c が include しているとする。 #include "sub.c" int main…

ライブラリの依存関係を調べる

C

ldd というコマンドで確認することができる。ls が依存するライブラリを調べる場合は以下のようになる。 $ ldd `which ls` linux-vdso.so.1 => (0x00007ffc6558b000) libselinux.so.1 => /lib/x86_64-linux-gnu/libselinux.so.1 (0x00007f1e0ba5c000) librt.…

分割コンパイル

C

C言語で作成したソースを gcc でコンパイルする際、何もオプションを指定しなければ a.out という名前の実行ファイルが生成される。しかし、実行ファイルができるまでにもいくつかの工程が存在している。 プリプロセッサの処理 オブジェクトコードの作成 オ…

逆アセンブルしてみる

C

objdump というコマンドで逆アセンブルできるみたいなのでちょっとやってみた。とりあえず、以下の HelloWorld プログラムを逆アセンブルしてみる。本当に Just Memo という内容だが。 #include <stdio.h> int main(void){ printf("HelloWorld!\n"); return 0; } これ</stdio.h>…

C言語によるスーパーLinuxプログラミング

C

標題の書籍を購入してみました。Amazonのリンクはhttp://www.amazon.co.jp/C%E8%A8%80%E8%AA%9E%E3%81%AB%E3%82%88%E3%82%8B-%E3%82%B9%E3%83%BC%E3%83%91%E3%83%BCLinux%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%9F%E3%83%B3%E3%82%B0-C%E3%83%A9%E3%82%…

ポインタを堀り下げるその2

C

ポインタを堀り下げるその1 - Shammerismの続き。堀り下げるとか言ってもわかっている人からすればハア?何そのアタリマエのこと・・・みたいな感じなんだろうなぁ。まあ、そんなことはどうでもいい。自分がわかるようになることが重要なんだから。ポインタ…

ポインタを堀り下げるその1

C

配列とポインタその2 - Shammerism以来になるが、またポインタを少しやる。というか、もうちょっと堀り下げていきたいと思う。ポインタも最初は簡単。しかし、どこかのタイミングでよくわからなくなる。それがどこなのかはよくわからないが。変数に&をつけ…

MD5 と SHA-1 のサンプル実装

C言語のサンプル付きの MD5 と SHA-1 の説明サイトを見つけた。ブックマーク代わりにメモ。 The MD5 Message-Digest Algorithm US Secure Hash Algorithm 1 (SHA1) どちらもIPAのサイト。信用して問題ないだろう。本来はRFCを見ろって話なんだろうけれども。…

itoa 改良版-20110227

C

itoa 改良版-20110223 - Shammerismで言及していた負の数の処理とかをなるべく同じところにまとめたりしてみた。自分でできる範囲で可能な限りコードをスッキリさせたというところだろうか。 char * itoa(int x){ char * value; // int max is 2147483647, t…

itoa 改良版-20110223

C

itoa 改良版-20110217 - Shammerismの実装だと、10 の倍数だとうまくいかないことがわかった。その点を修正。 char * itoa(int x){ char * value; // int max is 2147483647, this is 10 digit. int i, j, digit, result; int length = -1; int rest = abs(x…

itoa 改良版-20110217

C

とりあえず、何か memset が悪さをしているということまではわかった。問題なく動作する環境もあったので何かのバグかもしれないと期待しつつ、、、でも結局原因は特定できず。malloc と memset を組み合わせると問題になるので、calloc を使ってみた。どの…

itoa の実装が・・・

先日、itoa 実装 - Shammerismで書いたitoaを別環境で -Wall でコンパイルしたら Warning が出るわ出るわ・・・標準のというか、OpenSource のライブラリを使用していると、そのバージョンが環境ごとに異なるというのはザラにあるわけで、移植性を持たせるの…

itoa 実装

atoi はあるが、itoa はない、ということで実装してみた。sprintf を使用すべし、というサイトが多いが、Java からプログラミングを始めた人間としては Java で標準的に使用できていた関数が存在しないのは苦しい。今後使いたくなるシーンも多いと予想された…

文字列から特定文字列を検索

ある文字列内に別の文字列が含まれているか確認し、含まれている場合はその先頭が何文字目かを返す。含まれていない場合は -1 が返される。 int match_string(const char * s, const char * x){ // check s includes x or not int base_str_length = strlen…

ioctl で NIC の様々な情報を取得

ioctl で NIC の情報を取得 - Shammerismでは IPv4 のみだったが、MTU や BroadCast アドレスなども取得する関数を作成してみた。 #include <arpa/inet.h> #include <ifaddrs.h> #include <net/if.h> #include <netinet/in.h> #include <stdio.h> #include <stdlib.h> #include <string.h> #include <sys/types.h> #include <sys/ioctl.h> #include <unistd.h> int…</unistd.h></sys/ioctl.h></sys/types.h></string.h></stdlib.h></stdio.h></netinet/in.h></net/if.h></ifaddrs.h></arpa/inet.h>

ioctl で NIC の情報を取得

特定NICのIPアドレスを取得する関数 - Shammerismのようにgetifaddrs 関数を使用しても取得できるが、IPv4 の情報であれば ioctl も使用できるようだ。struct ifreq が使用される。 #include <arpa/inet.h> #include <ifaddrs.h> #include <net/if.h> #include <netinet/in.h> #include <stdio.h> #include <stdlib.h> #include <string.h> </string.h></stdlib.h></stdio.h></netinet/in.h></net/if.h></ifaddrs.h></arpa/inet.h>…

特定NICのIPアドレスを取得する関数

NIC の IP Address を取得する - Shammerismの内容を少し変更して作成。実際にやってみると、どういうものか詳細はわからないがAF_PACKETの情報もあるようで、綺麗に取得するのは難しい印象。そのため、情報を返すのではなく渡された入れ物に結果を入れると…

NIC の IP Address を取得する

ホスト名から DNS の名前解決をするようなプログラムは以前に書いたことがあるが、RAW_SOCKET でプログラムを作成する際には使用する NIC からその NIC に設定されている IP Address を取得したい。サンプルを見つけたのでメモ。リンクはc++ - Get the IP ad…

NIC の MAC address を取得することに成功

C

NIC の MAC address を取得するも失敗 - Shammerismの文字化け調査で、ioctl request to get the HW addressを発見。ここの08-12-2003のコードでうまくいった。 #include <arpa/inet.h> #include <errno.h> #include <linux/if_ether.h> #include <net/if.h> // ifr #include <stdio.h> #include <stdlib.h> #include <string.h> #include <sys/ioctl.h> //</sys/ioctl.h></string.h></stdlib.h></stdio.h></net/if.h></linux/if_ether.h></errno.h></arpa/inet.h>…

NIC の MAC address を取得するも失敗

C

TCP や UDP の Socket は一通り書いてみたので、今度は RawSocket に挑戦したい。 TCP や UDP では、L2 や L3 のヘッダはおろか、TCP のヘッダも完全にお任せ。意識するのは Payload のみでよかった。だが、RawSocket ではそうも行かない。手始めに指定した …