我从该主题中找到了以下shell函数
mask2cdr ()
{
# Assumes there's no "255." after a non-255 byte in the mask
local x=${1##*255.}
set -- 0^^^128^192^224^240^248^252^254^ $(( (${#1} - ${#x})*2 )) ${x%%.*}
x=${1%%$3*}
echo $(( $2 + (${#x}/4) ))
}
cdr2mask ()
{
# Number of args to shift, 255..255, first non-255 byte, zeroes
set -- $(( 5 - ($1 / 8) )) 255 255 255 255 $(( (255 << (8 - ($1 % 8))) & 255 )) 0 0 0
[ $1 -gt 1 ] && shift $1 || shift
echo ${1-0}.${2-0}.${3-0}.${4-0}
}
您能否详细说明这些函数如何将cidr转换为netmask以及将netmask转换为cidr?具体来说,对set
,参数扩展${#…}
和算术扩展的调用$((…))
非常繁琐。
要从像这样的点十进制网络掩码中获取CIDR前缀,请执行以下操作:
255.255.192.0
您首先必须将四个八位位组转换为二进制,然后计算最高有效位(即前导位的数量):
11111111.11111111.11000000.00000000 # 18 ones = /18 in CIDR
此功能相当有创意。首先,我们剥离所有前导255
八位位组(即二进制全为八位的八位位组)并将结果存储在变量中x
:
local x=${1##*255.}
此步骤使用参数扩展,整个脚本非常依赖此参数。如果继续使用示例的网络掩码255.255.192.0
,则现在具有以下值:
$1: 255.255.192.0
$x: 192.0
接下来我们设置了三个变量:$1
,$2
,和$3
。这些称为位置参数 ; 它们很像普通的命名变量,但是通常在将参数传递给脚本或函数时进行设置。我们可以直接使用来设置值set --
,例如:
set -- foo bar # $1 = foo, $2 = bar
与位置参数相比,我更喜欢使用命名变量,因为它使脚本更易于阅读和调试,但是最终结果是相同的。我们设置$1
为:
0^^^128^192^224^240^248^252^254^
这实际上只是一个表,用于将某些十进制值转换为二进制并计算1
位数。我们稍后会再讨论。
我们设置$2
为
$(( (${#1} - ${#x})*2 ))
这称为算术扩展。它看起来很复杂,但实际上只是在计算1
我们在第一个命令中剥离的位数。它分解为:
(number of chars in $1 - number of chars in $x) * 2
在我们的情况下可以解决
(13 - 5) * 2 = 16
我们剥离了两个八位位组,得到16。这很有意义。
我们设置$3
为:
${x%%.*}
这是$x
第一个.
剥离后的所有值的值。在我们的情况下,这是192
。
我们需要将此数字转换为二进制并计算其中的1
位数,因此让我们回到“转换表”。我们可以将表格分为相等的块,每个块包含四个字符:
0^^^ 128^ 192^ 224^ 240^ 248^ 252^ 254^
以二进制形式,以上数字为:
00000000 10000000 11000000 11100000 11110000 11111000 11111100 11111110
# 0 ones 1 one 2 ones 3 ones ...
如果我们从左数起,则表中的每个四个字符的块对应1
于二进制的一个附加位。我们正在尝试进行转换192
,因此让我们先从表的最右边192
开始,然后将其存储在x
:
x=${1%%$3*}
$x
现在的值
0^^^128^
其中包含两个四个字符的块或1
二进制的两位。
现在,我们只需要将1
前255
八位字节的位(总共16个,存储在variable中$2
)和1
上一步中的位(总共2个)相加:
echo $(( $2 + (${#x}/4) ))
哪里
${#x}/4
是的字符数$x
除以4,即中的四个字符的块数$x
。
18
让我们继续运行前面的示例,该示例的CIDR前缀为18
。
我们set --
用来设置位置参数$ 1到$ 9:
$1: $(( 5 - ($1 / 8) )) # 5 - (18 / 8) = 3 [integer math]
$2: 255
$3: 255
$4: 255
$5: 255
$6: $(( (255 << (8 - ($1 % 8))) & 255 )) # (255 << (8 - (18 % 8))) & 255 = 192
$7: 0
$8: 0
$9: 0
让我们来看看用来设置公式$1
和$6
一点点接近。$1
设定为:
$(( 5 - ($1 / 8) ))
网络掩码的CIDR前缀的最大和最小值为32
11111111.11111111.11111111.11111111
子网掩码为0
00000000.00000000.00000000.00000000
上面的公式使用整数除法,因此可能的结果为1到5:
5 - (32 / 8) = 1
5 - ( 0 / 8) = 5
$6
设定为:
$(( (255 << (8 - ($1 % 8))) & 255 ))
让我们针对示例CIDR前缀进行细分18
。首先,我们取模数并做一些减法:
8 - (18 % 8) = 6
接下来,我们按此值将255按位移位:
255 << 6
这与将6 0
位二进制数推入255的末尾相同:
11111111000000
最后,我们将该值与255按位与:
11111111000000 &
00000011111111 # 255
这使
00000011000000
或简单地
11000000
看起来熟悉?这是二进制格式的网络掩码中的第三个八位位组:
11111111.11111111.11000000.00000000
^------^
以十进制表示的值是192。
接下来,我们根据的值移动位置参数$1
:
[ $1 -gt 1 ] && shift $1 || shift
在我们的例子中,值$1
是3,因此我们将位置参数3向左移动。的先前值$4
成为的新值$1
,的先前值$5
成为的值$2
,依此类推:
$1: 255
$2: 255
$3: 192
$4: 0
$5: 0
$6: 0
这些值应该看起来很熟悉:它们是我们的网络掩码中的十进制八位字节(最后加上两个额外的零)。要获得网络掩码,我们只需将前四个点之间的点打印出来即可:
echo ${1-0}.${2-0}.${3-0}.${4-0}
在-0
每个参数后表示使用0
作为默认值,如果参数没有设置。
255.255.192.0
问题内容: 我有一个表,其中包含一列作为CIDR值,例如,我还有其他2列(start_ip_range和end_ip_range),我想填充这2列FROM CIDR列 Java代码可能如下所示: 如何将其转换为MySql查询。 问题答案: 你可以这样转换 询问 样品表 或者,您可以在虚拟列中使用它。因此,您可以直接获得正确的值。 虚拟领域
我正在使用Spring Boot开发一个应用程序,在这里我实现了身份验证和授权。这是我的角色实体 Rold id在BaseModel中。我想从数据库中获取所有角色,为此我在RoleRepository中编写了一个方法,如下所示 但这又让我犯了这个错误 org . spring framework . core . convert . converternotfoundexception:未找到能够
问题内容: 给定CIDR地址,例如 如何确定面膜长度?() 如何确定掩码地址?() 如何确定网络地址?() 问题答案: 它由apache utils涵盖。 请参阅以下URL:http : //commons.apache.org/proper/commons- net/apidocs/org/apache/commons/net/util/SubnetUtils.html 注意:对于使用// 32
问题内容: 我有一个场景。 必需的输入和输出是JSON。 我需要一些转换代码或最好是xslt类型的语言才能将json从一种格式转换为另一种格式。该变压器也需要快速运行,因为转换将即时进行。 编辑 我没有收到INPUT对象的定义,它可能会在运行时更改。但是如果需要,我可以将类用于OUTPUT对象。我尝试以 json- > xml-> xslt-> xml-> json的方式进行此操作 ,但 此刻 每
我正试图从Netsuite中获取数据,并使用Mulesoft Dataweave元素和when将其保存到salesforce对象中,否则,请参见下面的代码片段,但给出了错误: 找不到将“SimpleDataType{type=java.util.LinkedHashMap,mimetype='/',encoding='null'}”转换为“CollectionDataType{type=java.
我有这门课: 这个问题: 但我有这个错误