خب مسلمه نباید long رو باز به عنوان یک رشته در نظر بگیرید و خود اون عددها رو قرار بدید. البته یه راه سادش اینه که همواره از سمت راست سه تا سه تا باشه. مثلا 10.33.100.1
رو به صورت 10033100001 ذخیره کنید که از راست سه تا سه تا جدا میکنید.
ولی چیزی که من میخواستم بگم هیچ کدوم از اینا نیست.
آی پی ورژن 4 همونطور که گفتم 4 بایت هست. اگر در مبنا 2 یا مثلا مبنا 16 بهش نگاه کنید ساده تر میشه.
اگر آی پی رو به صورت a.b.c.d در نظر بگیریم که هر کدوم از a تا d یک عدد بین 0 تا 255 هست، اونوقت عدد long برای ذخیره کردن آی پی به این صورت قابل ذخیره است:
int a = 10, b = 33, c = 100, d = 1;
long ip = (a << 24) | (b << 16) | (c << 8) | d;
System.out.println("Hex:" + Long.toString(ip, 16));
System.out.println("Dec:" + Long.toString(ip, 10));
System.out.println("Bin:" + Long.toString(ip, 2));
String ipStr = ((ip >> 24) & (0xFF)) +"."+
((ip >> 16) & (0xFF)) +"."+
((ip >> 8) & (0xFF)) +"."+
(ip & (0xFF));
System.out.println("IP:" + ipStr);
خروجی:
Hex:a216401
Dec:169960449
Bin:1010001000010110010000000001
IP:10.33.100.1
در کد بالا در خط 2 نحوه تبدیل به یک عدد long رو میبینید و در خط 4 به صورت عدد دهدهی. میبینید که هیچ شباهتی بین آی پی و عدد دهدهی نیست! ولی باینری رو اگر 8 تا 8 تا جدا کنید و هگزادسیمال را دو تا دو تا، به همون عددها در مبنای باینری و هگزادسیمال میرسید.
در قسمت ipStr هم عدد ip که از نوع long هست رو به یک رشته به فرمت IP تبدیل کردیم.
در خصوص << و >> که شیفت بیتی هستند اگر قبلا ندیدید سرچ کنید.
تنها کاری که لازمه انجام بدید اینکه هر ip که میخونید با split و تفکیک توسط "." اونها رو جدا و به عدد تبدیل کنید که با تابع Integer.valueOf به راحتی تبدیل میشه و...