Преобразование массива байтов в строку base64 с использованием bash [duplicate]

Когда вы объявляете ссылочную переменную (т. е. объект), вы действительно создаете указатель на объект. Рассмотрим следующий код, в котором вы объявляете переменную примитивного типа int:

int x;
x = 10;

В этом примере переменная x является int, и Java инициализирует ее для 0. Когда вы назначаете его 10 во второй строке, ваше значение 10 записывается в ячейку памяти, на которую указывает x.

Но когда вы пытаетесь объявить ссылочный тип, произойдет что-то другое. Возьмите следующий код:

Integer num;
num = new Integer(10);

Первая строка объявляет переменную с именем num, но она не содержит примитивного значения. Вместо этого он содержит указатель (потому что тип Integer является ссылочным типом). Поскольку вы еще не указали, что указать на Java, он устанавливает значение null, что означает «Я ничего не указываю».

Во второй строке ключевое слово new используется для создания экземпляра (или создания ) объекту типа Integer и переменной указателя num присваивается этот объект. Теперь вы можете ссылаться на объект, используя оператор разыменования . (точка).

Exception, о котором вы просили, возникает, когда вы объявляете переменную, но не создавали объект. Если вы попытаетесь разыменовать num. Перед созданием объекта вы получите NullPointerException. В самых тривиальных случаях компилятор поймает проблему и сообщит вам, что «num не может быть инициализирован», но иногда вы пишете код, который непосредственно не создает объект.

Например, вы можете имеют следующий метод:

public void doSomething(SomeObject obj) {
   //do something to obj
}

В этом случае вы не создаете объект obj, скорее предполагая, что он был создан до вызова метода doSomething. К сожалению, этот метод можно вызвать следующим образом:

doSomething(null);

В этом случае obj имеет значение null. Если метод предназначен для того, чтобы что-то сделать для переданного объекта, целесообразно бросить NullPointerException, потому что это ошибка программиста, и программисту понадобится эта информация для целей отладки.

Альтернативно, там могут быть случаи, когда цель метода заключается не только в том, чтобы работать с переданным в объекте, и поэтому нулевой параметр может быть приемлемым. В этом случае вам нужно будет проверить нулевой параметр и вести себя по-другому. Вы также должны объяснить это в документации. Например, doSomething может быть записано как:

/**
  * @param obj An optional foo for ____. May be null, in which case 
  *  the result will be ____.
  */
public void doSomething(SomeObject obj) {
    if(obj != null) {
       //do something
    } else {
       //do something else
    }
}

Наконец, Как определить исключение & amp; причина использования Трассировки стека

37
задан Phil Ross 4 February 2014 в 14:07
поделиться

7 ответов

Что-то вроде

cat /dev/urandom | base64

Что дает (много) таких вещей, как

hX6VYoTG6n+suzKhPl35rI+Bsef8FwVKDYlzEJ2i5HLKa38SLLrE9bW9jViSR1PJGsDmNOEgWu+6
HdYm9SsRDcvDlZAdMXAiHBmq6BZXnj0w87YbdMnB0e2fyUY6ZkiHw+A0oNWCnJLME9/6vJUGsnPL
TEw4YI0fX5ZUvItt0skSSmI5EhaZn09gWEBKRjXVoGCOWVlXbOURkOcbemhsF1pGsRE2WKiOSvsr
Xj/5swkAA5csea1TW5mQ1qe7GBls6QBYapkxEMmJxXvatxFWjHVT3lKV0YVR3SI2CxOBePUgWxiL
ZkQccl+PGBWmkD7vW62bu1Lkp8edf7R/E653pi+e4WjLkN2wKl1uBbRroFsT71NzNBalvR/ZkFaa
2I04koI49ijYuqNojN5PoutNAVijyJDA9xMn1Z5UTdUB7LNerWiU64fUl+cgCC1g+nU2IOH7MEbv
gT0Mr5V+XAeLJUJSkFmxqg75U+mnUkpFF2dJiWivjvnuFO+khdjbVYNMD11n4fCQvN9AywzH23uo
03iOY1uv27ENeBfieFxiRwFfEkPDgTyIL3W6zgL0MEvxetk5kc0EJTlhvin7PwD/BtosN2dlfPvw
cjTKbdf43fru+WnFknH4cQq1LzN/foZqp+4FmoLjCvda21+Ckediz5mOhl0Gzuof8AuDFvReF5OU

Или, без (бесполезного) cat + pipe:

base64 /dev/urandom

(тот же вид выхода ^^)

EDIT: вы также можете использовать опцию --wrap для base64, чтобы избежать «коротких линий» ":

base64 --wrap=0 /dev/urandom

Это приведет к удалению обертывания, и вы получите полноэкранный дисплей ^^

50
ответ дан Pascal MARTIN 19 August 2018 в 10:03
поделиться
  • 1
    вау ... Теперь у меня головокружение. – Stefano Borini 9 August 2009 в 00:43
  • 2
    «Все, что я вижу сейчас, это блондинка, брюнетка, рыжий». – alexanderpas 9 August 2009 в 00:50
  • 3
    @Stefano: так я сделал :-D; @alexanderpas: если смотреть случайные прокручивающие символы, вы видите таких персонажей, может быть, я должен чаще смотреть на случайные персонажи ^^ – Pascal MARTIN 9 August 2009 в 00:54
  • 4
    @alexanderpas: cat / dev / urandom | uuencode - | tr -d '0-9' | sed -e 's / ([@ $ & amp; ~ # (?) + & lt; gt; ^;]) / ^ [[1m ^ [[32m \ 1 ^ [[0m / g' | sed -e 's / ([*!]) / ^ [[30m \ 1 ^ [[0m / g' | sed -e 's / ([A-Z]) / ^ [[32m \ 1 ^ [[0m / g' | tr -d '\n' # 1) конвертировать ^ [в ctrl-v esc после вставки 2) можно улучшить, но теперь я устал;) – Stefano Borini 9 August 2009 в 01:27
  • 5
    base64 --wrap=0 /dev/urandom |head -c 100 вы получите 100 случайных символов base64. Если вы ищете экранную заставку, основанную на bash, , это было сделано до :-) – Adam Katz 28 May 2015 в 00:01

Уже есть несколько хороших ответов на то, как base64 кодирует случайные данные (т. е. cat /dev/urandom | base64). Однако в теле вашего вопроса вы уточните:

... закодировать [urandom] в командной строке таким образом, чтобы весь его вывод был читаемым символом, например base64 или uuencode .

Учитывая, что на самом деле вам не нужен синтаксический анализ base64 и просто хочу, чтобы он был доступен для чтения, я бы предложил

cat /dev/urandom | tr -dC '[:graph:]'

base64 выводить только буквенно-цифровые символов и двух символов (+ и / по умолчанию). [:graph:] будет соответствовать любому печатаемому без пробелов ascii, включая много символов / знаков препинания, которых недостает base64. Поэтому, используя tr -dC '[:graph:]', вы получите более случайный вывод и получите лучшую эффективность ввода / вывода.

Я часто использую < /dev/random stdbuf -o0 tr -Cd '[:graph:]' | stdbuf -o0 head --bytes 32 для генерации надежных паролей.

3
ответ дан Aaron J Lang 19 August 2018 в 10:03
поделиться
  • 1
    бесполезное использование кошки (UUoC) - рассмотрим вместо этого tr -dC '[:graph:]' </dev/urandom – RubyTuesdayDONO 23 January 2016 в 15:21

Ряд людей предложили cat ting и piping через base64 или uuencode. Одна из проблем заключается в том, что вы не можете контролировать, сколько данных читать (это будет продолжаться вечно, или пока вы не нажмете ctrl + c). Другая возможность - использовать команду dd, которая позволит вам указать, сколько данных нужно прочитать перед выходом. Например, для чтения 1kb:

dd if=/dev/urandom bs=1k count=1 2>/dev/null | base64

Другой вариант заключается в том, чтобы передать команду strings, которая может дать больше разнообразия в ее выходе (непечатаемые символы отбрасываются, любые прогоны менее 4 печатных отображаются символы [по умолчанию]). Проблема с strings заключается в том, что она отображает каждый «запуск» в своей собственной строке.

dd if=/dev/urandom bs=1k count=1 2>/dev/null | strings

(конечно, вы можете заменить всю команду на

strings /dev/urandom

, если вы не хотите, чтобы он когда-либо останавливался).

Если вы хотите что-то действительно напуганное, попробуйте один из:

cat -v /dev/urandom
dd if=/dev/urandom bs=1k count=1 2>/dev/null | cat -v
17
ответ дан Adam Batkin 19 August 2018 в 10:03
поделиться
  • 1
    Или head -c 100, например, будет печатать первые 100 байт файла. – Mark Rushakoff 9 August 2009 в 01:55
  • 2
    Если вы используете строки, вы также можете удалить новые строки с помощью дополнительного канала: strings /dev/urandom | perl -pe 's/\n//' – mivk 7 November 2013 в 02:22

Итак, что случилось с

cat /dev/urandom | uuencode -

?

Исправлено после первой попытки на самом деле не работало ... :: sigh ::

BTW. Многие утилиты unix используют «-» вместо имени файла, чтобы означать «использовать стандартный ввод».

4
ответ дан dmckee 19 August 2018 в 10:03
поделиться
  • 1
    не знал о тире. спасибо, что научил меня, что;) – alexanderpas 9 August 2009 в 00:43
  • 2
    (на самом деле тире означает stdout в этом случае) Бесполезное использование cat - сделайте это вместо этого: uuencode /dev/random - – Dennis Williamson 3 December 2009 в 06:09

Вы можете делать более интересные вещи с помощью FIFO-каналов BASH:

uuencode <(head -c 200 /dev/urandom | base64 | gzip)
1
ответ дан greyfade 19 August 2018 в 10:03
поделиться
cat /dev/urandom | tr -dc 'a-ZA-Z0-9'
2
ответ дан Serg 19 August 2018 в 10:03
поделиться
  • 1
    Это неправильный способ сделать это. Это не Base64, в преобразовании нет двух символов, поэтому он больше похож на Base62, и, следовательно, декодированные значения будут смещены, например. не настолько случайным. – Yann Droneaud 12 February 2013 в 16:05

Попробуйте

xxd -ps /dev/urandom

xxd(1)

-1
ответ дан Steven Penny 19 August 2018 в 10:03
поделиться
  • 1
    Это приведет к получению шестнадцатеричного / base16 not base64 – Aaron J Lang 4 February 2014 в 13:39
Другие вопросы по тегам:

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