C# で画像のりサイズを行う

正確には、Bitmap クラスで表される画像を、縦横比を維持したまま任意の矩形内に収まるようにリサイズして返すメソッド。
適当なコードなので、頭悪いかもしれない。

// 参照設定が無い場合は、そっちも必要。
using System.Drawing;
public static Bitmap ResizeImage(Bitmap image, double dw, double dh)
{
    double hi;
    double imagew = image.Width;
    double imageh = image.Height;

    if ((dh / dw) <= (imageh / imagew))
    {
        hi = dh / imageh;
    }
    else
    {
        hi = dw / imagew;
    }
    int w = (int)(imagew * hi);
    int h = (int)(imageh * hi);

    Bitmap result = new Bitmap(w, h);
    Graphics g = Graphics.FromImage(result);
    g.InterpolationMode = System.Drawing.Drawing2D.InterpolationMode.HighQualityBicubic;
    g.DrawImage(image, 0, 0, result.Width, result.Height);

    return result;
}

C# の UDP通信をSocketで行う。TTL の指定 & ブロードキャスト

using System.Net;
using System.Net.Sockets;

TTL の指定

// 送信先
IPEndPoint remoteIP = new IPEndPoint(IPAddress.Parse("192.168.11.2"), 80);

// 送信データ
byte[] data = new byte[16];

// UDP ソケットの作成
Socket s = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);

// TTL を設定
// TTLとは…→ http://e-words.jp/w/TTL-1.html
s.SetSocketOption(SocketOptionLevel.IP, SocketOptionName.IpTimeToLive, 255);

// データを送信
s.SendTo(data, 0, data.Length, SocketFlags.None, remoteIP);

ブロードキャスト

IPEndPoint remoteIP = new IPEndPoint(IPAddress.Broadcast, 10002);

byte[] data = new byte[16];
Socket s = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);
s.SetSocketOption(SocketOptionLevel.IP, SocketOptionName.IpTimeToLive, 16);
// ブロードキャストはこれで許可を入れないといけないっぽい
s.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.Broadcast, 1);

s.SendTo(data, data.Length, SocketFlags.None, remoteIP);

C# で マジックパケット(Wake On Lan、WOL)の送信

遠隔からコンピュータを起動する機能です。
起動されるコンピュータ側の設定も必要。

オーバーロードしてるから、長く見えるけど、要は一番下のメソッドが重要。

using System.Net;
using System.Net.Sockets;
using System.IO;
/// <summary>
/// マジックパケットを送信します。
/// </summary>
/// <param name="address">IPアドレス</param>
/// <param name="subnetmask">サブネットマスク</param>
/// <param name="physicalAddress">起動するマシンのMACアドレス</param>
private void SendMagicPacket(string address, string subnetmask, byte[] physicalAddress)
{
    SendMagicPacket(IPAddress.Parse(address), IPAddress.Parse(subnetmask), physicalAddress);
}

/// <summary>
/// マジックパケットを送信します。
/// </summary>
/// <param name="address">IPアドレス</param>
/// <param name="subnetmask">サブネットマスク</param>
/// <param name="physicalAddress">起動するマシンのMACアドレス</param>
private void SendMagicPacket(IPAddress address, IPAddress subnetmask, byte[] physicalAddress)
{
    uint uip = BitConverter.ToUInt32(address.GetAddressBytes(), 0);
    uint usub = BitConverter.ToUInt32(subnetmask.GetAddressBytes(), 0);

    uint result = uip | (usub ^ 0xFFFFFFFF);

    SendMagicPacket(new IPAddress(result), physicalAddress);
}

/// <summary>
/// ブロードキャストアドレス(255.255.255.255)に対してマジックパケットを送信します。
/// </summary>
/// <param name="physicalAddress">起動するマシンのMACアドレス</param>
private void SendMagicPacket(byte[] physicalAddress)
{
    SendMagicPacket(IPAddress.Broadcast, physicalAddress);
}

/// <summary>
/// 指定されたアドレスに対してマジックパケットを送信します。
/// 送信先のアドレスはブロードキャストアドレスである必要があります。
/// </summary>
/// <param name="broad">ブロードキャストアドレス</param>
/// <param name="physicalAddress">起動するマシンのMACアドレス</param>
private void SendMagicPacket(string broad, byte[] physicalAddress)
{
    SendMagicPacket(IPAddress.Parse(broad), physicalAddress);
}

/// <summary>
/// 指定されたアドレスに対してマジックパケットを送信します。
/// 送信先のアドレスはブロードキャストアドレスである必要があります。
/// </summary>
/// <param name="broad">ブロードキャストアドレス</param>
/// <param name="physicalAddress">起動するマシンのMACアドレス</param>
private void SendMagicPacket(IPAddress broad, byte[] physicalAddress)
{
    MemoryStream stream = new MemoryStream();
    BinaryWriter writer = new BinaryWriter(stream);
    for (int i = 0; i < 6; i++)
    {
        writer.Write((byte)0xff);
    }
    for (int i = 0; i < 16; i++)
    {
        writer.Write(physicalAddress);
    }

    UdpClient client = new UdpClient();
    client.EnableBroadcast = true;
    client.Send(stream.ToArray(), (int)stream.Position, new IPEndPoint(broad, 0));
}

C# でコンピュータのネットワークカードの名前の一覧を列挙

まぁ、2.0 ならこれで一覧がとれるかな?と。

using System.Net.NetworkInformation;
NetworkInterface[] nic = NetworkInterface.GetAllNetworkInterfaces();
foreach (NetworkInterface var in nic)
{
    Console.WriteLine(var.Description);
}

「MS TCP Loopback interface」 ってやつは、リストアップする際に除いたほうがイイ。
調べたら出てくると思うけど、localhost 接続用の仮想 NIC だったと思う。

WMI を使って、NIC一覧を取得するなら、こんな感じ。

using System.Management; //参照設定に System.Management を追加
ManagementClass mc = new ManagementClass("Win32_PerfRawData_Tcpip_NetworkInterface");
ManagementObjectCollection moc = mc.GetInstances();

foreach (ManagementObject mo in moc)
{
    // 情報を表示
    Console.WriteLine("名前     = {0}", mo["Name"]);
    Console.WriteLine("接続速度 = {0} Mbps", Convert.ToInt32(mo["CurrentBandwidth"]) / 1000 / 1000);

    Console.WriteLine("------");
}

無効になってる NIC は拾えないので(今は未検証だけど、たしかそうだった)、ご注意。

C# で Win32 のエラーコードをメッセージに変換する

まんまです。
FormatMessageA とか、その辺を使えばいいのかな?と思ったのですが、
すげー面倒そうなので、他を調べたら出てきました。
動いたのでメモ。

/// <summary>
/// 指定されたエラーコードから、エラーを説明するメッセージと16進数表現を返します。
/// </summary>
/// <param name="code"></param>
/// <returns></returns>
public static string FormatMessage(int code)
{
    byte[] b = BitConverter.GetBytes(code);
    Array.Reverse(b);//リトルエンディアンなので
    string bs = "0x" + BitConverter.ToString(b, 0).Replace("-", "");

    return string.Format("{0}({1})", new System.ComponentModel.Win32Exception(code).Message, bs);
}

C# で GB とか KB とかを全部 MB にする

何を言ってるか分からないと思うが、とにかく 10GB とか 5000KB とかそういう文字列を全部 MB 単位に調整する。

動作例

4GB → 4096
256 → 256
1024KB → 1
10G → 10240

コード

   private static int ExParse(string moji)
   {
       string m = moji.Trim().ToUpper();
       int result = 0;
       if (m.Contains("KB") || m.Contains("K"))
       {
           m = m.Replace("KB", "").Replace("K","").Trim();
           result = (int)(float.Parse(m) / 1024);
       }
       else if (m.Contains("MB") || m.Contains("M"))
       {
           m = m.Replace("MB", "").Replace("M","").Trim();
           result = (int)(float.Parse(m));
       }
       else if (m.Contains("GB") || m.Contains("G"))
       {
           m = m.Replace("GB", "").Replace("G","").Trim();
           result = (int)(float.Parse(m) * 1024);
       }
       else if (m.Contains("TB") || m.Contains("T"))
       {
           m = m.Replace("TB", "").Replace("T","").Trim();
           result = (int)(float.Parse(m) * 1024 * 1024);
       }
       else
       {
           result = (int)(float.Parse(m));
       }

       return result;
   }