![]() |
Tjenare,
Fick hjälp av er för någon månad sedan att konvertera ett IP (xxx.xxx.xxx.xxx) till ett 32-bitars tal (eller ja, jag hittade faktiskt lösningen själv :P ) Nu undrar jag hur man räknar ut motsatsen; ett numeriskt värde till en sträng (IP)? Exempelvis talet 2130706433 ska bli "127.0.0.1" Google har svikit mig i denna fråga... :blink: |
Function CStrIP(ByVal anNewIP)
Dim lsResults ' Results to be returned Dim lnTemp ' Temporary value being parsed Dim lnIndex ' Position of number being parsed anNewIP = anNewIP + 2147483648 ' Parse highest numbers first For lnIndex = 3 To 0 Step -1 ' Parse the current value for this position lnTemp = Int(anNewIP / (256 ^ lnIndex)) ' Append the number to the final results delimited by a dot lsResults = lsResults & lnTemp & "." ' Remove the number that we just parsed anNewIP = anNewIP - (lnTemp * (256 ^ lnIndex)) Next ' Cut off last dot lsResults = Left(lsResults, Len(lsResults) - 1) ' Return the results CStrIP = lsResults End Function Function CLngIP(ByVal asNewIP) Dim lnResults Dim lnIndex Dim lnIpAry ' Split the IP address using the dot as a delimiter lnIpAry = Split(asNewIP, ".", 4) ' Loop through each number in the IP address For lnIndex = 0 To 3 ' If we are not working with the last number... If Not lnIndex = 3 Then ' Convert the number to a value range that can be parsed from the others lnIpAry(lnIndex) = lnIpAry(lnIndex) * (256 ^ (3 - lnIndex)) End If ' Add the number to the results lnResults = lnResults + lnIpAry(lnIndex) Next lnResults = lnResults - 2147483648 'Return the results CLngIP = lnResults End Function |
Använder du PHP kan du prova med "long2ip" (och "ip2long"). Ska du spara i MySQL kan du använda INET_NTOA (och INET_ATON).
|
(jag kör c# med MsSQL)
Svartrock, tack för hjälpen, men jag ställer mig lite undrande till om CStrIP verkligen fungerar som den ska? Om jag skickar in mitt tal, 2130706433, så får jag "255.0.0.1" istället för "127.0.0.1". Som kuriosa; om jag skickar in 0 så får jag "128.0.0.0" .... hmmm, det borde väl bli "0.0.0.0"?? Den verkar vara 127 "off" på beräkningen... Nu har jag iofs översatt din vb kod till c# men ändringarna var minimala så jag tror inte jag har fumlat till något på vägen. :/ |
Koden är i classic asp och där fungerar den som den ska.
Om man använder funktionen för att konvertera 127.0.0.1 till 32-bitars så ska svaret bli -16777215. Har använt den här koden själv i några år. Ska labba lite med koden .net och se vad som händer |
uj uj uj vad mycket kod. Bitmaska istället så blir koden upp till 4 rader lång.
|
Bitmaska... hmmmm är Kullervo på humör för en liten ungefärlig demo? :)
|
Detta borde fungera (Utan att kunna C#):
str=""+((tal>>24)&255)+"."+((tal>>16)&255)+"."+((t al>>8)&255)+"."+(tal&255); |
Citat:
|
Tjoho, det fungerade bra! Hade ni varit kvinnor hade ni fått en puss, nu får ni nöjja er med ett tack istället. Tack! ;)
|
Lite bakomliggande matte för den intresserade...
Vårt normala sätt att räkna är det decimala talsystemet. Deci kommer från grekiskan och betyder tio. Tio i det här fallet innebär att vi har tio symboler (siffror) som vi använder att räkna med (0-9). I vårt sätt att räkna så är siffrans position avgörande för dess värde. Varje siffra är tio gånger mer värd än siffran till höger om den. Om vi tar 12345 som exempel så har femmans position ett värde av 1. Femman är värd 5*1=5. Fyrans position är värd 10. 4*10=40. Treans position är förstås värd 100, 3*100=300. Vi lägger ihop siffrornas värden multiplicerat med deras positioner och får 1*10000 + 2*1000 + 3*100 + 4*10 + 5*1 = 10000 + 2000 + 300 + 40 + 5 = 12345. Att varje position är värd tio gånger mer än den till höger beror naturligtvis på att det är tio siffror vi har. Allt det här är så självklart att man inte tänker på det... Men faktum är att det funkar på precis samma sätt när man räknar binärt, oktalt, hexadecimalt eller ska skriva IP-adresser. Det enda som skiljer är antalet siffror. Om vi tar det binära talet 100101 som exempel. Det binära talsystemet har två siffror. Varje position är alltså värd två gånger mer än den till höger. Positionernas värden blir alltså 1, 2, 4, 8, 16 och 32. 1*1 + 2*0 + 1*4 + 0*8 + 0*16 + 1*32 = 1+4+32 = 37 Det hexadecimala talsystemet har 16 siffror. Man använder först symbolerna 0-9 och därefter a-f för att fylla upp. a=10, b=11, c=12, d=13, e=14, f=15. Positionernas värden är 1, 16, 256, 4096. 4f3c = 12*1 + 3*16 + 15*256 + 4*4096 = 12 + 48 + 3840 + 16384 = 20284 Slutligen, det som det handlade om från början... IP-adresser. Dessa består av fyra siffror i ett talsystem med 256 siffror. Symbolerna man använder för dessa siffror är våra vanliga tal mellan 0 och 255. Eller hexadecimalt från 00 till ff. Eller binärt från 00000000 till 11111111. (Se, visst blir det mer elegant i binär form? Och datorn kan ju bara räkna binärt, så det passar ju fint.) Positionernas värde är alltså 256 gånger större än den till höger. 1, 256, 65536 och 16777216. För att göra om 195.35.83.17 räknar man alltså: 17*1 + 83*256 + 35*65536 + 195*16777216 = 17 + 21248 + 2293760 + 3271557120 = 3273872145 Men så var det ju det här med att räkna baklänges också... Hur skriver vi 31337 hexadecimalt? Jo, då blir det heltalsdivision med rest. Vi börjar med den största positionens värde. Hur många gånger går 4096 i 31337? 7. Första siffran en sjua. Vi fortsätter med resten: 4096*7 = 28672, 31337-28672 = 2665. Hur många gånger går 256 i 2665? 10. Andra siffran a. 256*10 = 2560, 2665-2560 = 105. Hur många gånger går 16 i 105? 6. Tredje siffran 6. 16*6 = 96, 105-96 = 9. Sista siffran 9. 31337 blir alltså 7a69 hexadecimalt. Så, IP-adressen 2130706433. Vi börjar med 16777216. Det ryms 127 gånger i talet. 127*16777216 = 2130706432, 2130706433-2130706432 = 1. Hur många gånger går 65536 i 1? 0 gånger. Hur många gånger 256 i 1? 0 gånger. Hur många gånger går 1 i 1? 1 gång. 127.0.0.1. |
Citat:
|
ja, rotera är något annat :)
|
Alla tider är GMT +2. Klockan är nu 03:51. |
Programvara från: vBulletin® Version 3.8.2
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
Svensk översättning av: Anders Pettersson