go - Converting integer in reverse order to gererate IP in reverse order -


i wanted generate ip in reverse order.

functionality generate ip address follow:

val := 1<<(32-prefixlen) // let take prefixlen 24 ip4(val) = ip4(256) = 0.0.1.0 

i wanted ip in reverse order i.e., 0.1.0.0, convert val in reverse order bytes , send ip4() function.

functionality have tried resulted in integer overflow:

temp1:=byte(val*0xff<<24)     temp2:=byte(val*0xff00<<16)    temp3:=byte(val*0xff0000<<8) temp4:=byte(val*0xff000000)   valreverse := uint32(temp4)|uint32(temp3)|uint32(temp2)|uint32(temp1) ip4(valreverse)=0.1.0.0 //expected 

reversing bytes

first, have use uint32 type instead of byte byte value has 8 bits (bit positions above 8 don't exist).

next, have use bitwise , & , not multiplication *.

third, shift values incorrect. see working example:

prefixlen := uint32(24)  var val uint32 val = 1 << (32 - prefixlen) fmt.printf("%08x\n", val)  temp1 := uint32(val & 0xff << 24) temp2 := uint32(val & 0xff00 << 8) temp3 := uint32(val & 0xff0000 >> 8) temp4 := uint32(val & 0xff000000 >> 24) valreverse := uint32(temp4) | uint32(temp3) | uint32(temp2) | uint32(temp1)  fmt.printf("%08x\n", valreverse) 

output (try on go playground):

00000100 00010000 

but use net.ip type models ip address byte slice, , using can reverse bytes slice-reversing algorithm.

this how like:

ip := net.ipv4(0, 0, 1, 0).to4() fmt.println(ip)  // reverse: i, j := 0, len(ip)-1; < j; i, j = i+1, j-1 {     ip[i], ip[j] = ip[j], ip[i] } fmt.println(ip) 

output (try on go playground):

0.0.1.0 0.1.0.0 

note: if have ip value of uint32, can still use net.ip type, creating net.ip value this:

ip := net.ipv4(byte(val>>24), byte(val>>16), byte(val>>8), byte(val)).to4() 

reversing bits

if want reverse bits, have bit-by-bit. 1 possible solution this:

prefixlen := uint32(24)  var val uint32 val = 1 << (32 - prefixlen) fmt.printf("%08x\n", val)  var valreverse uint32 := 0; < 32; i, val = i+1, val>>1 {     valreverse = valreverse<<1 | val&0x01 } fmt.printf("%08x\n", valreverse) 

output (try on go playground):

00000100 00800000 

an alternative, maybe more complex way reverse bits:

var valreverse uint32 mask1, mask2 := uint32(0x01), uint32(0x80000000); mask2 != 0; mask1, mask2 = mask1<<1, mask2>>1 {     if val&mask1 != 0 {         valreverse |= mask2     } } 

output same, try variant on go playground.


Comments

Popular posts from this blog

aws api gateway - SerializationException in posting new Records via Dynamodb Proxy Service in API -

asp.net - Problems sending emails from forum -