68user's page 掲示板

Prev< No. 3165〜3170> Next  [最新発言に戻る] [過去ログ一覧]
No. 3165 # へにか [URL] 2003/03/27 (木) 08:10:23
かなりお久しぶりです。

>>3163 68user
実は私も、チェックサム=合計と思っていました。cksumのように
CRC演算するものもチェックサムと呼ばれるようになった経緯を何
かご存知でしたら、教えていただけませんか?

#少なくとも、CRC演算は合計(=サム)ではないです・・・

No. 3166 # 68user 2003/03/27 (木) 08:26:35
>>3165 へにか
> 実は私も、チェックサム=合計と思っていました。
広義のチェックサムと狭義のチェックサムがあって、狭義の
チェックサムは
      http://www.jp.freebsd.org/cgi/mroff.cgi?subdir=man&man=cksum&dir=jpman-5.0.0%2Fman#sect2
で言うところのアルゴリズム 1 なのだろうとわたしは思って
います。このマニュアルではアルゴリズム 2・3 も「チェックサム」
と呼んでますね (それが一般的なのかどうかはわかりませんが)。

>>3163 68user
を書いたときは、わたしの中では「チェックサム=広義のチェックサム」
だったので、あのような書き方をしましたが、
> ファイルをバイナリで開いて、そのファイルの全バイナリ値の
> 合計のことだそうです。
は正しいですね。失礼しました。

No. 3167 # 68user 2003/03/27 (木) 08:30:37
>>3166 68user
> チェックサムは
> http://www.jp.freebsd.org/cgi/mroff.cgi?subdir=man&man=cksum&dir=jpman-5.0.0%2Fman#sect2
> で言うところのアルゴリズム 1 なのだろう
あ、加算のたびに右ローテートって書いてあるので、アルゴリズム 1 も
「狭義のチェックサム」とは異なるんですね。

No. 3168 # saki 2003/03/27 (木) 11:54:48
68userさん、へにかさん
ご返答ありがとうございます。

大変、勉強になりました。
チェックサムといっても、いろいろなやり方があるのですね。

>cksum や md5 などのコマンドを利用した方がよいです。
組込のLinuxだったので上記のようなコマンドがなく、
自作しました。
全バイナリ値を合計して、16bit桁あふれしたら、
あふれた分を削除するという簡単なものです。
こんなのでもいいのかなと不安になりますが、
貴重な情報をありがとうございました。

No. 3169 # ふくし 2003/03/27 (木) 19:36:18
すいません、また質問です。

Windows で ActivePerl を使うと、
\r\n を読み込むと \n を読み込んだと思い込み、
\n を書き出すと \r\n を書き出そうとする習性があります。

これを停止するために
  binmode STDIN;
  binmode STDOUT;
とするのですが、こうすると
  while (<>) {
      ...
  }
で読み込もうとするときに、
  C:\> perl スクリプト名 < ファイル
だとうまくいくのですが、
  C:\> perl スクリプト名 ファイル
だとうまくいきません。

つまり、<> は引数でファイル名を渡されると、
STDIN 以外のファイルハンドルからファイルを読んでいるようなのですが、
このファイルハンドル名は分かるでしょうか?

ActivePerl を Windows 2000 以降で使うと、
スクリプト名に .pl という拡張子を付けると
  C:\> スクリプト名
でいきなり実行できて便利なのですが、
このスクリプトの中で <> を使うと、
  C:\> スクリプト名 ファイル名
だとうまくいくのですが、
  C:\> スクリプト名 < ファイル名
だと '<' を第1の引数と思い込んでうまくありません。

動かそうとしてるのはしょうもないファイルダンプツールです。

# fdump.pl

#$file = shift;

#open IN, $file;
#binmode IN;
binmode STDIN;
binmode STDOUT;

#$/ = "\r\n";

while (<>) { # 1行ずつ読み込み
    $line1 = $line2 = $line3 = ""; # 作業域を初期化
    @char = split //; # 1文字ずつ分解
    foreach $char (@char) { # 1文字ずつ処理
        $line1 .= $char; # 文字をそのまま $line1 にくっつける
        $hex = unpack "H2", $char; # $charを16進数値に変換して$hexに格納
        ($hex1, $hex2) = split //, $hex; # $hexを1文字ずつ分解して$hex1、$hex2に格納
        $line2 .= $hex1; # 16進数の前半を$line2にくっつける
        $line3 .= $hex2; # 16進数の後半を$line3にくっつける
    }
    print $line1; # $line1を出力する(改行はもともとついている)
    print "$line2\r\n"; # $line2+改行を出力する
    print "$line3\r\n"; # $line2+改行を出力する
}

No. 3170 # 68user 2003/03/27 (木) 21:09:17
>>3164 has
> straceしてみると、どうもpoll()で受信を検出できていないようです。
ほほう、glibc の問題かカーネルの問題かはわかりませんが、今どきの
Linux でそんな問題にぶちあたるとは運がいいですね。

ここは一気に UDP・IP スタックを解析して、Linus にパッチを送付する
まで頑張ってください。しかし粘りますねぇ (笑)

# NIC を変えたらすんなり直ったりして。


>>3169 ふくし
% grep '<>' /usr/src/contrib/perl5/*
/usr/src/contrib/perl5/toke.c: /* turn <> into <ARGV> */

となったので、それを手がかりに調べてみると、perl(1) に
以下のように書いてありました。

      次のループは、

                while (<>) {
                          ... # 各行に対するコード
                }

      以下の疑似コードと同等になります。

                unshift(@ARGV, '-') if $#ARGV < $[;
                while ($ARGV = shift) {
                          open(ARGV, $ARGV);
                          while (<ARGV>) {
                                    ... # 各行に対するコード
                          }
                }

本当に binmode ARGV でうまくいくのかどうかは試していません。

他の調べ方としては print %main::; でシンボルテーブルを表示し、
片っ端から試してみる、とかですかね。

Prev< No. 3165〜3170> Next  [最新発言に戻る] [過去ログ一覧]