PoshCode Archive  Artifact Content

Artifact ec64a837518e3c8f8aa176424d9512afc3b0f91986247af35bb93e80750fd5fe:

  • File hex2dec.ps1 — part of check-in [1df2f3d1c9] at 2018-06-10 13:33:43 on branch trunk — This script is analog of Sysinternals hex2dec but with additional feature interactive mode. At last it has been wrote on command language, no C\C++. (user: greg zakharov size: 4206)

# encoding: ascii
# api: powershell
# title: hex2dec
# description: This script is analog of Sysinternals hex2dec but with additional feature – interactive mode. At last it has been wrote on command language, no C\C++.
# version: 2.01
# author: greg zakharov
# license: CC0
# x-poshcode-id: 3971
# x-archived: 2013-03-01T18:33:10
# x-published: 2013-02-20T15:57:00
#
# Added (+) and moved (-):
# 2.01
# +Not need full prefix for hexademical numbers (0Γ—017a = x017a)
# -Parsing numbers starts with 0 (0503 => err or 017a => err)
# -Switches β€œ-h”, β€œ/h”, β€œhelp”, β€œ/help”, β€œ?” and β€œ/?”, to get help just enter β€œhex2dec ?”
# For bugs reporting – gregzakh@gmail.com
#
@echo off
  ::interactive mode
  if "%1" equ "" (
    if not defined run goto:interactive
    goto:error
  )
  ::null results
  for %%i in ("x0" "0x0") do if "%1" equ "%%~i" goto:null
  ::parsing arguments
  setlocal enabledelayedexpansion
    ::only one argument should input
    set "arg=0"
    for %%i in (%*) do set /a "arg+=1"
    if "%arg%" neq "1" if not defined run goto:help
    if "%arg%" neq "1" if defined run goto:error

    ::get length of argument
    set "i=0"
    set "str=%1"
    for /l %%i in (0, 1, 255) do (
      set "chr=!str:~%%i!"
      if defined chr set /a "i+=1"
    )
    ::checking first n symbols
    if !i! equ 1 (
      if "%str%" equ "0" goto:null
      if "%str%" equ "x" goto:error
    )
    if !i! equ 2 (
      if "%str:~0,1%" equ "0" goto:error
      if "%str:~0,1%" equ "x" set "str=0%str%" && goto:check
    )
    if !i! gtr 2 (
      if "%str:~0,1%" equ "0" if "%str:~1,1%" neq "x" goto:error
      if "%str:~0,1%" equ "0" if "%str:~1,1%" equ "x" goto:hex2dec
      if "%str:~0,1%" equ "x" set "str=0%str%" && goto:check
    )
    for %%i in (a b c d e f) do if "%str:~0,1%" equ "%%i" set "str=0x%str%" && goto:hex2dec

    :check
    2>nul set /a "res=%str%"
    if "%errorlevel%" equ "0" (
      if "%str%" equ "%res%" goto:dec2hex
      goto:hex2dec
    )
    echo "%str%" | findstr /r [0-9a-f] > nul
    if "%errorlevel%" equ "0" set "str=0x%str%" && goto:hex2dec
    goto:error

    :dec2hex
    set "map=0123456789ABCDEF"
    for /l %%i in (1, 1, 8) do (
      set /a "res=str & 15, str >>=4"
      for %%j in (!res!) do set "hex=!map:~%%j,1!!hex!"
    )
    for /f "tokens=* delims=0" %%i in ("!hex!") do set "hex=0x%%i"
    echo %1 = !hex! & goto:eof

    :hex2dec
    2>nul set /a "res=%str%"
    if "%errorlevel%" gtr "0" goto:error
    for /f "tokens=2,3" %%i in ('findstr "# " "%~dpnx0"') do set "str=!str:%%i=%%j!"
    if "%res%" neq "" if "%res%" neq "0" (echo %str% = %res%) else goto:error
  endlocal
exit /b

:error
  echo =^>err
exit /b 1

:null
  echo =^>nil
exit /b 0

:help
::Hex2dec v2.01 - converts hex to decimal and vice versa
::Copyright (C) 2012-2013 greg zakharov
::
::Usage: hex2dec [decimal | hexademical]
::
::Example 1:
::  C:\>hex2dec 0x017a
::  0x017A = 378
::
::Example 2:
::  C:\>hex2dec 017a
::  =>err
::
::Example 3:
::  C:\>hex2dec x017a
::  0x017A = 378
::
::Example 4:
::  C:\>hex2dec 17a
::  0x17A = 378
::
::Example 5:
::  C:\>hex2dec 0503
::  =>err
::
::Example 6:
::  C:\>hex2dec x503
::  0x503 = 1283
::
::Example 7:
::  C:\>hex2dec 1283
::  1283 = 0x503
::
::Example 8:
::  C:\>hex2dec 503
::  503 = 0x1F7
::
::Note: hex2dec starts with interactive mode if there is
::no argument.
for /f "tokens=* delims=:" %%i in ('findstr "^::" "%~dpnx0"') do echo.%%i
exit /b 0

rem :: Upper case chart ::
# a A
# b B
# c C
# d D
# e E
# f F
rem ::   End of chart   ::

:interactive
  ::interactive mode on
  echo Hex2dec v2.01 - converts hex to decimal and vice versa
  echo.
  echo Enter decimal or hexademical number and press Enter to
  echo take result. Use "exit" or "clear" commands to quit or
  echo to make host clear.
  echo.
  setlocal
    ::already launched marker
    set "run=true"
    :begin
    set /p "ask=>>> "
    cmd /c "%~dpnx0" %ask%
    if "%ask%" equ "clear" cls
    if "%ask%" equ "exit"  cls & goto:eof
    echo.
    goto:begin
  endlocal
exit /b