0

C#で完了するタスクがあります。私はサブネット名を持っています:192.168.10.0/24

サブネットマスクを見つける必要があります。この場合は、255.255.255.0になります。

ただし、System.Netライブラリを使用せずにC#でこれを実行できる必要があります(プログラミングしているシステムはこのライブラリにアクセスできません)。

プロセスは次のようになります。

1)サブネット名を数値とビットに分割します。

2)私がSOで見つけたビットをこれに押し込みます(サブネットマスク「/」表記をCisco 0.0.0.0標準に変換することに感謝します):

var cidr = 24; // e.g., "/24" 
var zeroBits = 32 - cidr; // the number of zero bits 
var result = uint.MaxValue; // all ones 

// Shift "cidr" and subtract one to create "cidr" one bits; 
//  then move them left the number of zero bits. 
result &= (uint)((((ulong)0x1 << cidr) - 1) << zeroBits); 

// Note that the result is in host order, so we'd have to convert 
//  like this before passing to an IPAddress constructor 
result = (uint)IPAddress.HostToNetworkOrder((int)result); 

ただし、私が抱えている問題は、作業しているシステムでIPAddress.HostToNetworkOrderコマンドを含むライブラリにアクセスできないことです。また、私のC#はかなり貧弱です。誰かが役立つC#の知識を持っていますか?

4

2 に答える 2

3

そのメソッドを次のように置き換えることができます。

static void ToNetworkByteOrder(ref uint n) {
    if(BitConverter.IsLittleEndian) {
        // need to flip it
        n = (
            (n << 24)
            |
            ((n & 0xff00) << 8)
            |
            ((n & 0xff0000) >> 8)
            |
            (n >> 24)
        );
    }
}
于 2012-10-24T15:46:58.163 に答える
2

マスクを取得する簡単な方法は次のとおりです。

int mask = -1 << (32 - cidr);

Net正しい順序でバイトを取得するためにアセンブリは必要ありません。BitConverterクラスを使用できます。

if (BitConverter.IsLittleEndian) {
  byte[] parts = BitConverter.GetBytes(mask);
  Array.Reverse(parts);
  mask = BitConverter.ToInt32(parts, 0);
}
于 2012-10-24T15:34:53.313 に答える