As noted in my previous post, I’ve been working on a small script to make the conversion of dotted decimal IP addresses into their hexadecimal values much simpler and automated. Below is the result of that work and the companion lookup table file that makes this conversion work.

The script is written to request and to output information for use with Mikrotik’s RouterOS DHCP Server. When invoked, the script confirms that the lookup table is in the correct location; proceeding if found and exiting with directions if the lookup file is not found. Users are asked for the subnet mask of the network they want to advertise, the dotted decimal network address of the network they want to advertise, and the dotted decimal IP address of the gateway to the network they want to advertise. Output will show all original values, their hexadecimal values, and one complete string for use directly with Mikrotik’s RouterOS.

To use this script, copy the code below into a file names ip2hex.sh, set the execute bit with chmod +x ip2hex.sh, save the script in you ~/bin folder, then copy the lookup table content into a csv file titled ip2hex_lookup.csv and save that in /usr/local/etc/ on your machine.

It is important to note:

  1. For the network address, you can exclude any non-significant octets (e.g. 10.10.10 instead of 10.10.10.0) and the output will still be correct. This is not mandatory, just a benefit of how the lookup is performed and is useful because this is the format preferred by RouterOS.

  2. This script expects the lookup table of decimal and hex values to be located in /usr/local/etc/ on your system. This location is defined as a variable in the script and you are free to store the lookup file anywhere you like, just ensure that you update the tableLoc variable at the beginning of the script to match your placement of the file.

While I wrote this to solve a very specific problem, it would be very easy to delete the loop that deals with ip addresses and use this script as a general purpose decimal (0-255) to hexadecimal converter. Please use and modify this script for any purpose you need!

ip2hex.sh script

#!/usr/bin/env bash

##ip2hex.sh

#Simple script to convert a subnet mask, network, and gateway ip addresses into their corresponding hexadecimal values.
#Built for use with Mikrotik RouterOS DHCP Server options - static route advertisement.
#Requires companion file ip2hex_lookup.csv which should be distributed with this script.
#James, www.jm.technology - October 27, 2019


##Confirm necessary lookup table is present before proceeding
##If no lookup table is found, print error message and exit with error code 1
tableLoc=/usr/local/etc/ip2hex_lookup.csv
cat ${tableLoc} > /dev/null
check=$?

if [ ${check} != 0 ]; then
	clear
	echo "Necessary lookup table is missing. Add ip2hex_lookup.csv to /usr/local/etc/ and rerun this script"
	exit 1
else
	echo "Lookup table found."
	sleep 1
	clear
fi


##Initial user input and variable assignment
read -p "Please input the subnet mask of the network to be advertised: " mask
mask=${mask}
read -p "Please input the full network address to be advertised (in format xxx.xxx.xxx.xxx): " address
address=${address}
read -p "Please input the full ip address of the gateway to the network (in format xxx.xxx.xxx.xxx): " gateway
gateway=${gateway}
i=1
hexAddress=""
hexGate=""


##Conversion to hexadecimal values

#Convert the subnet mask into hexadecimal value
hexMask=$(grep ${mask} < ${tableLoc} | head -1 | cut -d "," -f 2)

#Convert the network and gateway IP addresses into hexadecimal values
while [ ${i} -lt 5 ]; do
	partialIp=$(echo ${address} | cut -d "." -f ${i} )	
	partialGate=$(echo ${gateway} | cut -d "." -f ${i} )	
	partialHexAdd=$(grep ${partialIp} < ${tableLoc} | head -1 | cut -d "," -f 2)
	partialHexGate=$(grep ${partialGate} < ${tableLoc} | head -1 | cut -d "," -f 2)
	hexAddress="${hexAddress}${partialHexAdd}"
	hexGate="${hexGate}${partialHexGate}"
	i=$((i+1))
done

clear


##Output the converted information to the screen
echo "The hexadecimal value of subnet mask /${mask} is: ${hexMask}"
echo "The hexadecimal value of network address ${address} is: ${hexAddress}"
echo "The hexadecimal value of the gateway IP address ${gateway} is: ${hexGate}"
echo "For use in Mikrotik RouterOS, the full string is: 0x${hexMask}${hexAddress}${hexGate}"

exit 0

This script acomplishes exactly what it set out to do and I am proud of it. In it’s initial state, the IP addresses are not checked for correct format and errors like letters rather than decimal values or extranneous octets are silently ignored. I am still learning a lot about Bash scripting and plan to implement error checking and handling into this in the future to ensure output is always correct. Below are the values for the companion file necessary for the conversion.

When revisions are made to this script in the future I will share the updated code on this site.

Values for the ip2hex_lookup.csv file

Octet Value,Final Hex Value
0,00
1,01
2,02
3,03
4,04
5,05
6,06
7,07
8,08
9,09
10,0A
11,0B
12,0C
13,0D
14,0E
15,0F
16,10
17,11
18,12
19,13
20,14
21,15
22,16
23,17
24,18
25,19
26,1A
27,1B
28,1C
29,1D
30,1E
31,1F
32,20
33,21
34,22
35,23
36,24
37,25
38,26
39,27
40,28
41,29
42,2A
43,2B
44,2C
45,2D
46,2E
47,2F
48,30
49,31
50,32
51,33
52,34
53,35
54,36
55,37
56,38
57,39
58,3A
59,3B
60,3C
61,3D
62,3E
63,3F
64,40
65,41
66,42
67,43
68,44
69,45
70,46
71,47
72,48
73,49
74,4A
75,4B
76,4C
77,4D
78,4E
79,4F
80,50
81,51
82,52
83,53
84,54
85,55
86,56
87,57
88,58
89,59
90,5A
91,5B
92,5C
93,5D
94,5E
95,5F
96,60
97,61
98,62
99,63
100,64
101,65
102,66
103,67
104,68
105,69
106,6A
107,6B
108,6C
109,6D
110,6E
111,6F
112,70
113,71
114,72
115,73
116,74
117,75
118,76
119,77
120,78
121,79
122,7A
123,7B
124,7C
125,7D
126,7E
127,7F
128,80
129,81
130,82
131,83
132,84
133,85
134,86
135,87
136,88
137,89
138,8A
139,8B
140,8C
141,8D
142,8E
143,8F
144,90
145,91
146,92
147,93
148,94
149,95
150,96
151,97
152,98
153,99
154,9A
155,9B
156,9C
157,9D
158,9E
159,9F
160,A0
161,A1
162,A2
163,A3
164,A4
165,A5
166,A6
167,A7
168,A8
169,A9
170,AA
171,AB
172,AC
173,AD
174,AE
175,AF
176,B0
177,B1
178,B2
179,B3
180,B4
181,B5
182,B6
183,B7
184,B8
185,B9
186,BA
187,BB
188,BC
189,BD
190,BE
191,BF
192,C0
193,C1
194,C2
195,C3
196,C4
197,C5
198,C6
199,C7
200,C8
201,C9
202,CA
203,CB
204,CC
205,CD
206,CE
207,CF
208,D0
209,D1
210,D2
211,D3
212,D4
213,D5
214,D6
215,D7
216,D8
217,D9
218,DA
219,DB
220,DC
221,DD
222,DE
223,DF
224,E0
225,E1
226,E2
227,E3
228,E4
229,E5
230,E6
231,E7
232,E8
233,E9
234,EA
235,EB
236,EC
237,ED
238,EE
239,EF
240,F0
241,F1
242,F2
243,F3
244,F4
245,F5
246,F6
247,F7
248,F8
249,F9
250,FA
251,FB
252,FC
253,FD
254,FE
255,FF

Reference Material: