Skip to content

Instantly share code, notes, and snippets.

@ytez
Last active June 4, 2019 15:06
Show Gist options
  • Save ytez/a98d68118aa5bfdcf1e9ae13421f59b5 to your computer and use it in GitHub Desktop.
Save ytez/a98d68118aa5bfdcf1e9ae13421f59b5 to your computer and use it in GitHub Desktop.
PowerShell で簡単なAsciiダンパをつくる

 !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~
@echo off
chcp 65001
pushd %~dp0
set EXEFILE=%~n0.ps1
PowerShell ^
-ExecutionPolicy RemoteSigned ^
-WindowStyle Maximized ^
-File "%EXEFILE%" "%1"
popd
pause
chcp 932
exit /b %ERRORLEVEL%
Param( [String]$file )
Write-Host $file
[Byte[]]$data = Get-Content $file -Encoding Byte
Write-Host
$enc_ascii = [system.Text.Encoding]::GetEncoding("ASCII")
[String]$bufHex = ''
[String]$bufChar = ''
[Int32]$cnt = 0
foreach($a in $data) {
$bufHex = $bufHex + ' ' + $a.ToString("X2").PadLeft(3)
[String]$tmp = $enc_ascii.getchars($a)
if ($a -eq 0) {
[String]$char = 'NUL'
}
elseif ($a -eq 1) {
[String]$char = 'SOH'
}
elseif ($a -eq 2) {
[String]$char = 'STX'
}
elseif ($a -eq 3) {
[String]$char = 'ETX'
}
elseif ($a -eq 4) {
[String]$char = 'EOT'
}
elseif ($a -eq 5) {
[String]$char = 'ENQ'
}
elseif ($a -eq 6) {
[String]$char = 'ACK'
}
elseif ($a -eq 7) {
[String]$char = 'BEL'
}
elseif ($a -eq 8) {
[String]$char = 'BS'
}
elseif ($a -eq 9) {
[String]$char = 'HT'
}
elseif ($a -eq 10) {
[String]$char = 'LF'
}
elseif ($a -eq 11) {
[String]$char = 'VT'
}
elseif ($a -eq 12) {
[String]$char = 'FF'
}
elseif ($a -eq 13) {
[String]$char = 'CR'
}
elseif ($a -eq 14) {
[String]$char = 'SO'
}
elseif ($a -eq 15) {
[String]$char = 'SI'
}
elseif ($a -eq 16) {
[String]$char = 'DLE'
}
elseif ($a -eq 17) {
[String]$char = 'DC1'
}
elseif ($a -eq 18) {
[String]$char = 'DC2'
}
elseif ($a -eq 19) {
[String]$char = 'DC3'
}
elseif ($a -eq 20) {
[String]$char = 'DC4'
}
elseif ($a -eq 21) {
[String]$char = 'NAK'
}
elseif ($a -eq 22) {
[String]$char = 'SYN'
}
elseif ($a -eq 23) {
[String]$char = 'ETB'
}
elseif ($a -eq 24) {
[String]$char = 'CAN'
}
elseif ($a -eq 25) {
[String]$char = 'EM'
}
elseif ($a -eq 26) {
[String]$char = 'SUB'
}
elseif ($a -eq 27) {
[String]$char = 'ESC'
}
elseif ($a -eq 28) {
[String]$char = 'FS'
}
elseif ($a -eq 29) {
[String]$char = 'GS'
}
elseif ($a -eq 30) {
[String]$char = 'RS'
}
elseif ($a -eq 31) {
[String]$char = 'US'
}
elseif ($a -eq 32) {
[String]$char = 'SPC'
}
elseif ($a -eq 127) {
[String]$char = 'DEL'
}
else {
[String]$char = $tmp
}
$bufChar = $bufChar + ' ' + $char.PadLeft(3)
$cnt += 1
if ($cnt -eq 16) {
Write-host $bufHex
Write-host $bufChar
Write-host
$bufHex = ''
$bufChar = ''
$cnt = 0
}
}
Write-Host $bufHex
Write-Host $bufChar

概要

TeraTermのバイナリログとか見てエスケープシーケンスの解読とかするときにバイナリダンプできるといいよねって思って( ´・‿・`)

方針

まだあまり難しいことはできないので単純に。

  • 1bytesずつ読み込んで、文字に直す
  • 制御文字に関しては、2~3文字のシンボルに直す
  • 上に16進数、下に文字を表示
  • 16bytesごとに折り返し
  • PowerShellExecution-Policy がデフォルトでも動かせるように、BAT を経由させる
  • BAT にファイルをドロップして実行できるようにする

実行例

# bat に ファイルをドロップしてもよい (引数1扱い)
> .\ascii_dump.bat ascii_0-127_sample.txt

Active code page: 65001
ascii_0-127_sample.txt

  00  01  02  03  04  05  06  07  08  09  0A  0B  0C  0D  0E  0F
 NUL SOH STX ETX EOT ENQ ACK BEL  BS  HT  LF  VT  FF  CR  SO  SI

  10  11  12  13  14  15  16  17  18  19  1A  1B  1C  1D  1E  1F
 DLE DC1 DC2 DC3 DC4 NAK SYN ETB CAN  EM SUB ESC  FS  GS  RS  US

  20  21  22  23  24  25  26  27  28  29  2A  2B  2C  2D  2E  2F
 SPC   !   "   #   $   %   &   '   (   )   *   +   ,   -   .   /

  30  31  32  33  34  35  36  37  38  39  3A  3B  3C  3D  3E  3F
   0   1   2   3   4   5   6   7   8   9   :   ;   <   =   >   ?

  40  41  42  43  44  45  46  47  48  49  4A  4B  4C  4D  4E  4F
   @   A   B   C   D   E   F   G   H   I   J   K   L   M   N   O

  50  51  52  53  54  55  56  57  58  59  5A  5B  5C  5D  5E  5F
   P   Q   R   S   T   U   V   W   X   Y   Z   [   \   ]   ^   _

  60  61  62  63  64  65  66  67  68  69  6A  6B  6C  6D  6E  6F
   `   a   b   c   d   e   f   g   h   i   j   k   l   m   n   o

  70  71  72  73  74  75  76  77  78  79  7A  7B  7C  7D  7E  7F
   p   q   r   s   t   u   v   w   x   y   z   {   |   }   ~ DEL

Press any key to continue . . .

実行例2

https://gist.github.com/ytez/af41ea5f4755b98693f6eaa2b09eb1cf

これの CRLF LF 混在 CSV を試しに dump してみる

> .\ascii_dump.bat linebreak_in_fields.csv

Active code page: 65001
linebreak_in_fields.csv

  61  2C  22  62  0A  22  2C  63  0D  0A  31  2C  22  32  0A  22
   a   ,   "   b  LF   "   ,   c  CR  LF   1   ,   "   2  LF   "

  2C  33  0D  0A
   ,   3  CR  LF
Press any key to continue . . .

修正

ToDo

  • この If-Else 地獄をなんとかしないと…
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment