C# 如何填充一个位数组,以便将其复制到一个字节 请考虑将斜杠符号(例如24, 30)转换成子网掩码的(非作业)练习。
当我将C# 如何填充一个位数组,以便将其复制到一个字节 请考虑将斜杠符号(例如24, 30)转换成子网掩码的(非作业)练习。,c#,bit-manipulation,bitarray,C#,Bit Manipulation,Bitarray,当我将位数组复制到字节[]时,位数组的内部顺序会导致不正确的输出。 例如,输入numberOfSetBits=24,ToString()应返回255.255.255.0(这是因为位是对称的)。 但是,输入30会导致255.255.255.63,而不是预期的255.255.255.252。 是的,我意识到了这一点(关于这个问题有很多争论,不幸的是没有解决方案,只是一个关于为什么一次订购会更好的永无休止的争论) 但是,看在上帝的份上,我怎样才能让这个密码来对待它是什么而不是把它弄坏呢?我相信我将不得
位数组
复制到字节[]
时,位数组
的内部顺序会导致不正确的输出。
例如,输入numberOfSetBits=24
,ToString()
应返回255.255.255.0
(这是因为位是对称的)。
但是,输入30
会导致255.255.255.63
,而不是预期的255.255.255.252
。
是的,我意识到了这一点(关于这个问题有很多争论,不幸的是没有解决方案,只是一个关于为什么一次订购会更好的永无休止的争论)
但是,看在上帝的份上,我怎样才能让这个密码来对待它是什么而不是把它弄坏呢?我相信我将不得不改变我在第一位添加位的顺序,但我无法让它工作
public class SubnetMask
{
private byte[] parts = new byte[4];
public static SubnetMask FromSlash(int numberOfSetBits)
{
BitArray bits = new BitArray(32);
for (int i = 0; i < numberOfSetBits; i++)
{
bits[i] = true;
}
return new SubnetMask(bits);
}
private SubnetMask(BitArray bits)
{
bits.CopyTo(parts, 0);
}
public override string ToString()
{
return string.Join(".", parts);
}
}
公共类子网掩码
{
专用字节[]部分=新字节[4];
来自斜杠的公共静态子网掩码(整数)
{
位数组位=新的位数组(32);
for(int i=0;i
谢谢。这不是可以通过以下方式解决的:
int bitPlace = 32;
for (int i = 0; i < numberOfSetBits; i++)
{
bits[--bitPlace] = true;
}
您不需要
位数组
,您可以通过移位整数来创建掩码,并使用位转换器.GetBytes
将其作为字节:
public static SubnetMask FromSlash(int numberOfSetBits) {
int mask = numberOfSetBits == 0 ? 0 : -1 << (32 - numberOfSetBits);
byte[] bits = BitConverter.GetBytes(mask);
if (BitConverter.IsLittleEndian) Array.Reverse(bits);
return new SubnetMask(bits);
}
sprash中的公共静态子网掩码(int numberofsetbit){
int mask=numberOfSetBits==0?0:-1@Mehrdad nice one-记下另一个我不知道存在的类:-)@ChrisShain:lol。我想你的意思是struct
:p这确实有效,但是它需要在子网掩码中进行此更改:parts=parts.Reverse().ToArray()
修复字节的顺序。谢谢你的努力-我投了赞成票,但我只能设置一个post作为答案。有趣的是,它对0的输入不起作用。有什么解释为什么将整数左移32位会让我保留原来的整数吗?@codesparkle:啊……移位只使用第二个操作数的五位,即x这很烦人..我想知道为什么必须这样限制。你能更新你的答案以反映这一点吗?例如numberOfSetBits==0?0:-1
public static SubnetMask FromSlash(int numberOfSetBits) {
int mask = numberOfSetBits == 0 ? 0 : -1 << (32 - numberOfSetBits);
byte[] bits = BitConverter.GetBytes(mask);
if (BitConverter.IsLittleEndian) Array.Reverse(bits);
return new SubnetMask(bits);
}