Convert IP addresses from decimal to IPv4 and format output using vectoring

12 次查看(过去 30 天)
Hello,
I want to convert a vector of IP addresses in decimal format to the IPv4 format.
So far I have implemented this using a for loop and the output is a cell array of chars.
function result = dec2IP(decimalIP)
% Derive the octets
dec = double(decimalIP);
byte1=floor(dec/power(256,3));
mod1=mod(dec, power(256,3));
byte2=floor(mod1/power(256,2));
mod2=mod(mod1, power(256,2));
byte3=floor(mod2/power(256,1));
mod3=mod(mod2, power(256,1));
byte4=floor(mod3/power(256,0));
% Convert to char array
for i=1:length(decimalIP)
result(i) = {[int2str(byte1(i)), '.', int2str(byte2(i)), '.', int2str(byte3(i)), '.', int2str(byte4(i))]};
end
end
Is there a way to implement this using vectoring instead of a loop?
Thanks, George

采纳的回答

Ashish Gudla
Ashish Gudla 2014-8-4
You can probably convert the IP address from decimal to IPv4 format using vectorization however its not very intuitive. I used a different logic to convert.
Each value in IPv4 format can be obtained by applying bit operations on the decimal number as follows.
Right shift the decimal value 24 bits and apply “bitand” operator to the resulting number and 255. Similarly for the other values, right shift by 16 ,8 and 0 bits.
1st value :
bitand(bitshift(IPVector,-24), 255)
2nd value :
bitand(bitshift(IPVector,-16), 255)
3rd value :
bitand(bitshift(IPVector,-8), 255)
4th value :
bitand(bitshift(IPVector,0), 255)
See doc page of bitand( bitand doc ) and bitshift ( bitshift doc ) for usage.
Now you can simply concatenate all the 4 values with a “.” In between them to form a IPv4 format address using the following command:
strcat(
num2str(bitand(bitshift(IPVector,-24), 255)) ,'.',
num2str(bitand(bitshift(IPVector,-16), 255)) ,'.',
num2str(bitand(bitshift(IPVector,-8), 255)) ,'.',
num2str(bitand(bitshift(IPVector,0), 255))
)
Example:
>> IPVector = [3232235778 ; 3232235780 ; 3232235890]
IPVector =
1.0e+09 *
3.2322
3.2322
3.2322
>> IPVector_new = strcat(num2str(bitand(bitshift(IPVector,-24), 255)),'.',num2str(bitand(bitshift(IPVector,-16), 255)) ,'.',num2str(bitand(bitshift(IPVector,-8), 255)) ,'.',num2str(bitand(bitshift(IPVector,0), 255)) )
IPVector_new =
192.168.1. 2
192.168.1. 4
192.168.1.114
>> IPVector_new = strrep(cellstr(IPVector_new),' ','')
IPVector_new =
'192.168.1.2'
'192.168.1.4'
'192.168.1.114'

更多回答(1 个)

J-G van der Toorn
J-G van der Toorn 2015-12-3
I was thinking about this inline function:
ipstr = @(ip)sprintf('%d.%d.%d.%d',arrayfun(@(n)floor(mod(ip,2^(n*8))/2^((n-1)*8)),4:-1:1));
But with bitshift, it's also possible:
ipstr=@(ip)sprintf('%d.%d.%d.%d',arrayfun(@(n)bitand(bitshift(ip,-32+n*8), 255),1:4));
and even shorter. There might be an even shorter notation on Cody, or it will be there soon.

类别

Help CenterFile Exchange 中查找有关 Data Type Conversion 的更多信息

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!

Translated by