C# でバイト配列と16進数文字列を相互変換するには

.NET にバイト配列を16進数文字列にエンコード/デコードする方法が用意されていなかったので、自作した。(Base64 なら Convert にある。) 文字列への変換は、BitConverter.ToString に Replace("-", String.Empty) とすることでもできなくはなさそうだが、効率が良さそうには思えないので止めた。 Convert.ToString(b, 16) で b が16進数で1桁のときの0補完でハマった。 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 /// <summary> /// バイト配列と文字列との変換機能を提供する /// </summary> public class BytesConvert { /// <summary> /// バイト配列から16進数の文字列を生成します。 /// </summary> /// <param name="bytes">バイト配列</param> /// <returns>16進数文字列</returns> public static string ToHexString(byte\[\] bytes) { StringBuilder sb = new StringBuilder(bytes.Length * 2); foreach (byte b in bytes) { if (b < 16) sb.Append('0'); // 二桁になるよう0を追加 sb.Append(Convert.ToString(b, 16)); } return sb.ToString(); } /// <summary> /// 16進数の文字列からバイト配列を生成します。 /// </summary> /// <param name="str">16進数文字列</param> /// <returns>バイト配列</returns> public static byte\[\] FromHexString(string str) { int length = str.Length / 2; byte\[\] bytes = new byte\[length\]; int j = 0; for (int i = 0; i < length; i++) { bytes\[i\] = Convert.ToByte(str.Substring(j, 2), 16); j += 2; } return bytes; } }

2007年9月23日 · Toshimitsu Takahashi

C# から iTunes COM Windows SDK を試す

参照設定で COM - iTunes Type Library を追加する。フォームにラベルを貼って、現在 iTunes で再生中のトラックの アーティスト名 - 曲名 (アルバム名) を表示するサンプル。 COM のため Marshal.ReleaseComObject で参照解除をしてあげないと、iTunes を終了するときに握っている旨のメッセージが表示されてしまう。次にサンプルは終了時に連動して終了するようにしている。 ラベルの書き換えは、別スレッドからの操作だから Invoke してやること。 using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Text; using System.Windows.Forms; using System.Runtime.InteropServices; using iTunesLib; namespace WindowsApplication1 { public partial class Form1 : Form { private iTunesApp itunes; public Form1() { InitializeComponent(); init(); } private void init() { itunes = new iTunesApp(); itunes.OnAboutToPromptUserToQuitEvent += new _IiTunesEvents_OnAboutToPromptUserToQuitEventEventHandler(itunes_OnAboutToPromptUserToQuitEvent); itunes.OnPlayerPlayEvent += new _IiTunesEvents_OnPlayerPlayEventEventHandler(itunes_OnPlayerPlayEvent); } private void unhock() { itunes.OnPlayerPlayEvent -= new _IiTunesEvents_OnPlayerPlayEventEventHandler(itunes_OnPlayerPlayEvent); itunes.OnAboutToPromptUserToQuitEvent -= new _IiTunesEvents_OnAboutToPromptUserToQuitEventEventHandler(itunes_OnAboutToPromptUserToQuitEvent); Marshal.ReleaseComObject(itunes); itunes = null; } void itunes_OnPlayerPlayEvent(object iTrack) { IITTrack track = itunes.CurrentTrack; if (track != null) { label1.Text = track.Artist + " - " + track.Name + " (" + track.Album + “)”; Marshal.ReleaseComObject(track); } } void itunes_OnAboutToPromptUserToQuitEvent() { unhock(); this.Invoke((System.Windows.Forms.MethodInvoker)delegate() { this.Close(); }); } private void Form1_FormClosing(object sender, FormClosingEventArgs e) { if (itunes != null) unhock(); } } }

2007年6月11日 · Toshimitsu Takahashi