1. sakamotoryouta

    No comment

    sakamotoryouta
Changes in body
Source | HTML | Preview
@@ -1,63 +1,63 @@
# '192.168.11.0' みたいなのを、32bit数値にする
IPアドレスをCIDRで色々やったりする必要がありました。
最初は以下のようなコードを書いてました。
**うろ覚え・・・**
```javascript
function convertBinaryIp(ip) {
- const dividedIp = ip.split('/')[0].split('.');
+ const dividedIp = ip.split('.');
return dividedIp.reduce((accumulator, v, idx) => {
const bit = `00000000${parseInt(ip[i], 10).toString(2)}`;
accumulator + bit.slice(-8);
return accumulator;
}, '');
}
```
このコードで行くと、文字列で`10101010000~~`みたいなのが返ってきます。
なので、その後の計算も文字列にたいして`split()`したりしてました。
# 数値Onlyでやったほうが効率的
いちいち文字列の`10101000111~~`みたいな形式にするの非効率だよと教えて頂きました。
さらに、どうやって数値Onlyでやるかみたいなアドバイスも頂けたので処理を書き換えました。
```javascript
function convertBinaryIp(ip) {
- const dividedIp = ip.split('/')[0].split('.').reverse();
+ const dividedIp = ip.split('.').reverse();
const byte = 8;
return dividedIp.reduce((accumulator, v, idx) => {
const binary = (parseInt(v, 10) << (byte * idx)) >>> 0;
return accumulator + binary;
}, 0);
}
```
この関数を`convertBinaryIp('192.168.11.0')`みたいな感じで実行してあげれば、
`3232238336`のような数値が返ってきます。
この数値は2進数に直すと、`11000000101010000000101100000000`です。
```
11000000 => 192
10101000 => 168
00001011 => 11
00000000 => 0
```
この`3232238336`という数値を使えば、他のIPとの大小比較とかCIDRの範囲内か?とかもチェックできます。
CIDRの時に使用する、
上位24ビットをそのまま取得して、下位8ビットは0にするというような場合の式は以下です。
```
(ipアドレス & (~((1 << (32 - 24)) - 1))) >>> 0;
```
以上。