C#

WinAPI

System.Runtime.InteropServices名前空間はほかのプロセスにもハンドルにもスーッと効いてくれる……これは、ありがたい。 型名の置換を意識する必要があるのと、フラグ用定数とか調べるのが面倒くさすぎるけれども。

ビット演算

bsをbyte型の配列としたときに uint x = bs[3] << 24 | bs[2] << 16 | bs[1] << 8 | bs[0]; がエラーになるのはどうしてだろう。 単にビット演算の結果として符号付きの型が優先されているだけか。

WPFでメモ帳を作る

デザインとコードを分離できるのはすばらしいが……。 WPFでメモ帳を再現しようと思ったがステータスバーの表示/非表示の切り替えで詰まった。Margin.Bottomをいじると高さが調節されるのではなく上方向に移動してしまうのはなぜ……。Gridとかの配置を工夫する…

整数型の配列のハッシュコード

C#

byte型配列にファイルを読み込んでGetHashCodeメソッドでハッシュコードを取れば、CRC32を自前で実装したりSHA1とかの結果を圧縮したりしなくても32bitのハッシュ値を返すハッシュ関数として使えるのではないか? と思ったので配列のハッシュコードについて…

配列の最大要素数

C#

C#の仕様書(ECMA-334)によると、配列宣言時に指定する要素数にはulong型を指定できる。 よって、次のコードは有効なはず。 byte[] bs = new byte[ulong.MaxValue]; 実際、この段階ではエラーは起きない。 しかし、このバイト列を操作しようとすると算術結果…

自作数学ライブラリ

整数論をやるのに必要そうな関数を静的クラスにまとめてみた。 今のところ、 Mod(x, m) 符号が除数mと同じになるような剰余を返す GCD(x, y) 最大公約数を返す GCDEx(x, y) ax+by=GCD(x, y)となるような整数a, bを返す Inverse(x, m) mを法とする、正の整数x…

オブジェクトのハッシュコード

System.Collections.Hashtableは、キーとするオブジェクトのGetHashCode()の戻り値で一意性を保証しているとする。 GetHashCode()は32bit整数型を返すので、個以上のオブジェクトをHashtableに格納しようとすると必ず衝突が起きる? ということは、64bit整数…

SHA1ハッシュの計算

何でSHA1ハッシュを計算する方法が System.Security.Cryptography.SHA1Managed System.Security.Cryptography.SHA1CryptoServiceProvider System.Web.Security.FormsAuthentication.HashPasswordForStoringInConfigFile(str, "sha1") の3つもあるんだ。 1番…

Bitmap.LockBits メソッド

サンプルコードの通りにやってもエラーになるので半日くらい困っていたが、試しに開いていたいくつかの画像のフォーマットがたまたまFormat24bppRgbではなかっただけだった。 LockBitsメソッド使ってバイト列操作してもBitmap.GetPixel/SetPixelメソッドと3…

マルチバイト文字の扱い

やはりブロック単位で処理するとマルチバイト文字の扱いで問題が生じる。こういうのはどうやって判定すればいいんだろう? オーバーヘッドがかなり大きいが、最初から読み直すのが確実かな……。ディスクから読み出すよりも配列をコピーしていく方が速いか。

テキストファイルから一部分を取り出すプログラム

文字エンコーディングと改行コードを適切に変換するようにし、さらになるべく省メモリか高速になる書き方をしたらかなり可読性の低いコードになった……。 具体的には下記のような処理をするようにした。 テキストファイルをバイナリとして開き、先頭1KBくらい…

文字エンコーディングまわりの不可解な仕様

System.IO.StreamReaderで文字エンコーディングを指定しなかった場合、C#既定のUTF-16LEだけではなくUTF-16BEやUTF-8もちゃんどデコードされているのはなぜ? 文字エンコーディングを判別するメソッドが公開されていないのはなぜ?

ガベージコレクション

テキストファイルをバイナリとして開いてbyte配列に格納して操作したのち、stringで返すようなプログラムを組んでビルドした。 ところが40MBくらいのテキストファイルを2つ3つくらい開くと物理/仮想メモリの使用量が800MB/1300MBくらいになる。 あまり効果が…

Microsoft.Win32.RegistryKey.SetValue()とGetValue()

SetValueでbool値を保存するとレジストリには自動的に型変換されて文字列型で保存されるが、GetValueではbool値としては読み出せないのか……。

終了コード

エラー発生時に強制終了させたいときはApplication.Exit()じゃなくてEnvironment.Exit(int errCode)を使うのか……。

ListView項目の並べ替え

IComparerインターフェイスを実装したクラスを用いるということは分かっていたので、「ListViewの項目を並び替える: .NET Tips: C#, VB.NET, Visual Studio」を参考にさせていただいた。 ついでに通常のWindowsフォームのリストビューのようにソート方向を示…

コンストラクタコード

アプリケーションで使用する変数などを初期化するときはコンストラクタ内にコードを書くのが適切なのだろうけど、Windowsアプリケーションの場合はフォームが読み込まれるときのイベントから呼び出されるメソッドに初期化用のコードが書かれているソースコー…

DataTableから任意の列のデータを取り出すには

System.Data.DataColumnクラスではスキーマを定義し、DataRowで実データを扱う。よって、 string str; DataRowCollection drc = dataSet1.Tables["ExampleDataTable"].Rows; foreach(DataRow dr in drc) { // 0列目から取り出す str = dr[0].ToString(); } …

System.Data.DataSet.ReadXml()

ちゃんとxml宣言のencoding属性を見てキャラクターセットを判別してるんだな……。

System.Data.DataSetクラスのメソッド

XMLファイルからDataSetにXMLを読み書きするにはReadXml/WriteXmlメソッドを使えばいいようだが、これらでファイルを参照するときはStream型のほかにString型でオーバーロードされたメソッドを使うことができる。 しかし、インターネットで検索して上位にく…

Form派生クラス

些細なことにかなり時間をかけてしまった……。 public class Form2 : Form { string str; 《省略》 public string Str { get { return str; } } } public class Form1 : Form { 《省略》 [STAThread] static void Main() { Application.Run(new Form1()); } …

コンストラクタの内部で終了する

コンストラクタの中では通常の終了手順であるApplication.Exit()メソッドを呼び出してもプログラムを終了させられないので工夫が必要なようだ。 調べてみると例外を用いるのが普通……なのかな? メインエントリポイント /// <summary> /// アプリケーションのメイン エ</summary>…

コンソール出力の読み取り

コンソール出力を読み取ってダイアログで表示させることに成功。 System.Diagnostics.Process p = new System.Diagnostics.Process(); p.StartInfo.FileName = "command"; p.StartInfo.WindowStyle = System.Diagnostics.ProcessWindowStyle.Hidden; p.Start…