Поразрядное вычитание в Python

Firehose имеет региональные конечные точки, которые перечислены на этой странице:
https://docs.aws.amazon.com/general/latest/gr/rande.html

Используя конечную точку us-east-2 в качестве примера ...
Прямо сейчас firehose.us-east-2.amazonaws.com разрешает для меня 52.95.17.2, который в настоящее время представлен в документе ip-range.json как:
служба: AMAZON регион: США-восток -2 ip_prefix: 52.95.16.0/21

Если вы хотите узнать, какие диапазоны включены в белый список на брандмауэре, вам необходимо получить все диапазоны для AMAZON в us-east-2 (в настоящее время 34, если Вы включаете адреса IPv6). Примечание. Это предполагает, что все конечные точки подпадают под маркер сервиса AMAZON, и вы внесете в белый список гораздо больше сервисов, чем просто пожарный шланг, если внесете его в белый список.

Предыдущий контакт со службой поддержки AWS предполагает, что диапазоны можно добавлять без предупреждения, поэтому вам нужно будет часто проверять опубликованные диапазоны и обновлять брандмауэр, чтобы избежать ситуации, когда конечная точка преобразуется в новый IP-адрес, который не включен в белый список .

Если вы хотите пойти по пути частых проверок и белых списков, то такой скрипт Python можно использовать для получения соответствующих диапазонов IP-адресов:

#!/usr/bin/env python
import requests
aws_response = requests.get('https://ip-ranges.amazonaws.com/ip-ranges.json')
response_json = aws_response.json()
for prefix in response_json.get('prefixes'):
    if prefix.get('service') == 'AMAZON' and prefix.get('region') == 'us-east-2':
        print(prefix.get('ip_prefix'))

8
задан Community 23 May 2017 в 12:34
поделиться

3 ответа

Как я вчера указал в своем ответе на ответ CMS, лево-смещение отрицательного числа является неопределенным поведением в C, таким образом, это, как даже гарантируют, не будет работать в C (проблема состоит в том, как обработать бит со знаком, Вы смещаетесь, это как значение укусило, или разве это не затронуто сдвигом? Комитет по стандартам не мог договориться о поведении, таким образом, это оставили неопределенным).

Когда это, оказывается, работает в C, он полагается на фиксированные целые числа разрядной ширины так, чтобы крайний левый бит был отодвинут конец, когда Вы делаете сдвиг (он также требует, чтобы знаковый бит, который будут рассматривать как значение, укусил для смещения целей). Все целые типы в C являются фиксировано-разрядными, но количества Python могут быть произвольно большими. Лево-смещение числа в правых делах Python это, чтобы продолжать становиться больше:

>>> 1 << 100
1267650600228229401496703205376L

Вы могли попробовать что-то вроде этого:

x = (a << 1) & 0xffffffff

Для ограничения результата 32 битами проблема состоит в том, что левый оператор смещения в Python не смещает знаковый бит числа со знаком (который является частью того, что требуется, чтобы заставлять это конкретное решение работать). Мог бы быть способ изменить поведение оператора сдвига, но я не знаю как.

9
ответ дан 5 December 2019 в 14:07
поделиться

Смещение отрицательных чисел не имеет последовательной интерпретации между Python и C.

2
ответ дан 5 December 2019 в 14:07
поделиться

if i , j - два целых числа:

сложение:

printf("%d",(i^j)|((i&j)<<1));
1
ответ дан 5 December 2019 в 14:07
поделиться
Другие вопросы по тегам:

Похожие вопросы: