Skip to main content

How to Convert Between Octal and Decimal in Batch Script

Octal (Base-8) is a numbering system that uses only eight digits (0 through 7). While less common than Binary or Hexadecimal today, it is still frequently used in file permissions (especially in cross-platform environments) and some legacy computing systems. In Batch, converting between Octal and Decimal involves repeated division or multiplication by the number 8.

In this guide, we will demonstrate how to perform these conversions using iterative logic.

Method 1: Octal to Decimal

Each digit in an octal number represents a power of 8 based on its position. For example, $127$ (Octal) $= (1 \times 8^2) + (2 \times 8^1) + (7 \times 8^0) = 87$ (Decimal).

Implementation Script

@echo off
setlocal enabledelayedexpansion

set "octal=127"
set "decimal=0"
set "powerOf8=1"

:: Get the length of the octal string
set "temp=!octal!"
set "len=0"
:len_loop
if defined temp (
set "temp=!temp:~1!"
set /a "len+=1"
goto :len_loop
)

:: Process digits from right to left
:calc_loop
if !len! LEQ 0 goto :done_oct
set /a "len-=1"
set "digit=!octal:~%len%,1!"

set /a "val=digit * powerOf8"
set /a "decimal+=val"
set /a "powerOf8*=8"
goto :calc_loop

:done_oct
echo Octal: %octal%
echo Decimal: %decimal%
pause
tip

This method processes each character from the rightmost digit (least significant) to the leftmost, multiplying by increasing powers of 8. This avoids the need to reverse the string entirely.

Method 2: Decimal to Octal

To convert decimal to octal, repeatedly divide the number by 8 and record the remainders.

Implementation Script

@echo off
setlocal enabledelayedexpansion

set "dec=87"
set "oct="
set "original=%dec%"

echo Converting %dec% to Octal...

if !dec! EQU 0 (
set "oct=0"
goto :done_dec
)

:dec_loop
set /a "r=dec %% 8"
set "oct=!r!!oct!"
set /a "dec/=8"
if !dec! GTR 0 goto :dec_loop

:done_dec
echo Decimal: %original%
echo Octal: !oct!
pause
warning

The remainder concatenation line set "oct=!r!!oct!" must use delayed expansion on both sides. Using %rem% with percent signs would cause the value to be locked to its initial state before the loop begins, producing incorrect results.

Why Convert to Octal in Batch?

  1. File Permissions: Certain cross-platform tools and legacy Windows utilities store file security descriptors using octal flags.
  2. Network Configuration: Some older network protocols and hardware reporting systems use octal for port mapping or device IDs.
  3. Legacy System Audits: If your script reads logs from old mainframe or Unix-linked systems, the data may be presented in octal format.

⚠️ The Batch "Octal Trap"

In Batch arithmetic (set /a), numbers that start with a zero are automatically treated as Octal.

  • set /a x=010 results in 8, not 10.
  • set /a x=019 results in an Error (because 9 is not a valid octal digit).
danger

This is a common cause of bugs in scripts that handle dates (like the month "08" or "09"). If you are calculating with numeric strings that might have leading zeros, you must strip the zero or force decimal interpretation by prefixing with 1 and subtracting, or by using string manipulation to remove leading zeros before arithmetic.

Conclusion

Converting between Octal and Decimal adds a specialized layer of numeric handling to your scripts. By mastering the "Base-8" logic, you ensure your automation can interact with legacy data formats and security descriptors with absolute accuracy. This capability is essential for system administrators maintaining diverse, multi-platform environments and auditing aged system logs.