2017-12-19 7 views
0
의 네트워크 마스크 접두사와 점 분리 10 진수 형식 변환은

나는 여기에 관련 게시물을 찾을 수 있습니다.파이썬

그것에 노력 후, 지금 접두사 점으로 구분 된 십진수로 변환 할 수 있습니다 :

e_mask = lambda mask: sum(bin(int(i)).count('1') \ 
           for i in mask.split('.')) 

print(e_mask('255.255.255.0')) # there print `24` 

하지만 난 24255.255.255.0로 변환 사용하는 방법을 모르겠어요.

+0

'빈 ~ ((1 << (32-24)를) 다음 문자열로 다음 네 개의 개별 바이트로 마스크를 변환에 그것은 매우 간단합니다)) & ((1 <<32)-1))' =>''0b11111111111111111111111100000000' –

+0

@Dan. 매우 정교합니다. 파이썬이 첫 번째 부분을 무한대로 이끌어가는 개념을 보존하기 위해 음수로 만드는 방법을 좋아합니다. TIL –

+0

@Dan. 완전한 대답? –

답변

1

@DanD. 비트 카운트를 프리픽스 마스크로 쉽게 변환 할 수 있다고 지적했습니다. 1 - ((

def bits_to_mask(n): 
    if n < 0 or n > 32: 
     raise ValueError('Bit count must be between 0 and 32') 
    mask = (~((1 << (32 - n)) - 1)) & 0xFFFFFFFF 
    return '.'.join(map(str, ((mask >> (8 * i)) & 0xFF for i in range(3, -1, -1)))) 

[IDEOne Link]