備忘録

備忘録

C# 16進数文字列をbyte[]に変換する方法

Ⅰ. はじめに

タイトルの通り「16進数文字列をbyte[]に変換する方法」です。

Ⅲ. 16進数文字列→byte[]

Main.cs

static void Main(string[] args)
{
  byte[] bytes = "01 02 03".ToByteArray();
  // byte[] bytes = "0x010203".ToByteArray();
  // byte[] bytes = "010203".ToByteArray();
  // byte[] bytes = "0x01, 0x02, 0x03".ToByteArray();
  // byte[] bytes = "0x01 0x02 0x03".ToByteArray();
  // IEnumerable<byte> bytes = "01 02 03".ToByteSequence();
}

StringExtensions.cs

public static class StringExtensions
{
  public static IEnumerable<byte> ToByteSequence(this string source)
  {
    var sb = new StringBuilder(source);

    // "0x00, 0x01, 0x02" -> "00 01 02"
    // "0x000102" -> "000102"
    // "00 01 02" -> "000102"
    var str = sb
      .Replace("0x", "")
      .Replace(",", "")
      .Replace(" ", "")
      .ToString();

    for (int i = 0; i < str.Length / 2; i++)
    {
      yield return Convert.ToByte(str.Substring(i * 2, 2), 16);
    }
  }

  public static byte[] ToByteArray(this string source)
    => ToByteSequence(source).ToArray();
}

Ⅳ. byte[] → 16進数文字列

var bytes = new byte[] { 0x00, 0x01, 0x02, 0x03, 0x04, 0x05 };
Console.WriteLine(BitConverter.ToString(bytes));
// 00-01-02-03-04-05

Console.WriteLine(BitConverter.ToString(bytes).Replace("-", ""));
// 000102030405

Console.WriteLine($"0x{string.Join(" 0x", BitConverter.ToString(bytes).Split("-"))}");
// 0x00 0x01 0x02 0x03 0x04 0x05

// .NET 5以上
Console.WriteLine(Convert.ToHexString(bytes));
// 000102030405

はてなスターを無効にする方法

Ⅰ. はじめに

SEO、アクセス数目的で「はてなスター」をつける人が目立ってきました。
非常に不快かつ迷惑極まりない行為です。
はてなブログ利用者ができる対応として「はてなスター」の機能そのものを無効化させる方法を紹介します。

また、無駄なデータ通信を削減できる為、ページ表示速度向上が期待できます。

Ⅱ. やり方

1. 「設定」をクリック

f:id:kagasu:20170829194719p:plain

2. 「デザイン」をクリック

f:id:kagasu:20170829194812p:plain

3. 「はてなスター」のチェックを外す

f:id:kagasu:20170829194921p:plain

4. 「変更を保存する」をクリックする


以上です。

C# で Redis を使う

Ⅰ. はじめに

タイトルの通り「C# で Redis を使う方法」です。
ライブラリは「StackExchange.Redis」を使います。

Ⅱ. 使い方

NuGetから必要なライブラリをインストールします
Install-Package StackExchange.Redis

文字列をセットする

var redis = ConnectionMultiplexer.Connect("127.0.0.1:6379");
var db = redis.GetDatabase();
db.StringSet("mykey", "myvalue");
実行結果

f:id:kagasu:20170829125047p:plain

文字列を取得する

var redis = ConnectionMultiplexer.Connect("127.0.0.1:6379");
var db = redis.GetDatabase();
Console.WriteLine(db.StringGet("mykey"));
実行結果
myvalue

リストの先頭にデータを追加する

var redis = ConnectionMultiplexer.Connect("127.0.0.1:6379");
var db = redis.GetDatabase();

db.ListLeftPush("mykey", "value1");
db.ListLeftPush("mykey", "value2");
db.ListLeftPush("mykey", "value3");
実行結果

f:id:kagasu:20170829130155p:plain

リストの最後にデータを追加する

var redis = ConnectionMultiplexer.Connect("127.0.0.1:6379");
var db = redis.GetDatabase();

db.ListRightPush("mykey", "value1");
db.ListRightPush("mykey", "value2");
db.ListRightPush("mykey", "value3");
実行結果

f:id:kagasu:20170829130249p:plain

リストの要素数を数える

var redis = ConnectionMultiplexer.Connect("127.0.0.1:6379");
var db = redis.GetDatabase();

db.ListLength("mykey")
実行結果
3

C# でSMTP サーバを建ててメールを受信する方法

Ⅰ. はじめに

タイトルの通り「C#SMTP サーバを建ててメールを受信する方法」です。
cosullivan/SmtpServer を使います

f:id:kagasu:20200825103907p:plain
※画像はWikipediaより

Ⅱ. やり方

1. NuGetから必要なライブラリをインストールする
Install-Package SmtpServer
Install-Package MimeKit
Install-Package System.Text.Encoding.CodePages

※.NET CLIの場合

dotnet add package SmtpServer
dotnet add package MimeKit
dotnet add package System.Text.Encoding.CodePages
2. サンプルプログラムを書く
using MimeKit;
using SmtpServer;
using SmtpServer.Mail;
using SmtpServer.Protocol;
using SmtpServer.Storage;
using System;
using System.Text;
using System.Threading;
using System.Threading.Tasks;

namespace SmtpServerTest
{
  public class SampleMessageStore : MessageStore
  {
    public override Task<SmtpResponse> SaveAsync(ISessionContext context, IMessageTransaction transaction, CancellationToken cancellationToken)
    {
      var textMessage = (ITextMessage)transaction.Message;

      var message = MimeMessage.Load(textMessage.Content);

      Console.WriteLine($"date: [{message.Date}]");
      Console.WriteLine($"subject: [{message?.Subject}]");
      Console.WriteLine($"text_body: [{message?.TextBody.Trim()}]");
      Console.WriteLine($"html_body: [{message?.HtmlBody.Trim()}]");

      return Task.FromResult(SmtpResponse.Ok);
    }
  }

  class Program
  {
    static async Task Main(string[] args)
    {
      Encoding.RegisterProvider(CodePagesEncodingProvider.Instance);

      var options = new SmtpServerOptionsBuilder()
        .MessageStore(new SampleMessageStore())
        .Port(25)
        .Build();

      var smtpServer = new SmtpServer.SmtpServer(options);
      await smtpServer.StartAsync(CancellationToken.None);
    }
  }
}
3. ドメインにMXレコードを登録する
4. Gmailから送信テスト

f:id:kagasu:20170828173122p:plain

5. 受信結果

f:id:kagasu:20170828173146p:plain

Ⅲ. トラブルシューティング

Q. メールが受信できない
A. ファイアウォール設定を適切に行う

Windows ダウンロードしたファイルをブロックさせない

Ⅰ. はじめに

デフォルト設定の場合、インターネットからダウンロードしたファイルには自動的に「ゾーン識別子情報」が付加されます。
これによりファイルにアクセスしようとするとセキュリティの警告が表示されます。

f:id:kagasu:20170828145409j:plain
f:id:kagasu:20170828145553p:plain

Ⅱ. ブロックさせない方法(「ゾーン識別子情報」を付加させない方法)

1.以下のテキストをx.regという名前をつけて保存し、実行する。
Windows Registry Editor Version 5.00

[HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Policies\Attachments]
"SaveZoneInformation"=dword:00000001

Ⅲ. 注意

「ゾーン識別子情報」はセキュリティ上非常に重要な意味があります。
「ゾーン識別子情報」が無い場合SmartScreenでのチェックが行われない為マルウェア等に対して脆弱になります。
「ゾーン識別子情報」を付加させないという意味が理解できる方のみ設定を行って下さい。

以上です。