Построение IP и порта из байтового буфера - PullRequest
3 голосов
/ 03 декабря 2009

У меня есть байтовый буфер длиной 6 байтов, первые четыре содержат IP-адрес, последние 2 содержат порт, в формате с прямым порядком байтов.

чтобы получить IP, который я использую,

(apply str (interleave (map int (take 4 peer)) (repeat ".")))

Безопасно ли приводить байты к int для получения IP-адреса?

а также в Java я использую,

    int port = 0;
    port |= peerList[i+4] & 0xFF;
    port <<= 8;
    port |= peerList[i+5] & 0xFF;

этот фрагмент, чтобы получить адрес порта. Как я могу преобразовать это в clojure?

1 Ответ

2 голосов
/ 03 декабря 2009

да отображение их должно быть безопасным в этом случае, потому что любые ведущие нули, наведенные записью в больший тип данных, снова исчезнут при преобразовании в строку

Вторая часть становится намного проще, потому что вы начинаете со списка байтов.

(+ (* 256 (nth 5 peer)) (nth 4 peer))

Более общая функция для преобразования списков байтов в числа, извлеченные из здесь

(defn bytes-to-num [bytes] 
     (let [powers (iterate #(* % 256) 1)]
       (reduce + 0 (map * bytes powers))))
...