Байт имеет 8 битов, что означает, что вы можете иметь максимальное значение 0xff в качестве значения.
Но Java использует подписанный байт, что означает, что msb зарезервирован для подписанного бита. Это оставляет вам только 7 битов для вашего значения, поэтому вы можете хранить максимум 0x7f в байтовой переменной. Любое число больше 0x07f приведет к переполнению.
Попробуйте использовать массив int. Поскольку int использует 4 байта (32 бита), следовательно, всегда будет место для 8 битов.
использовать byte [] для чтения из потока, а затем скопировать содержимое в int [], использовать int intArr[i] = byteArr[i] & 0xFF;
для i-го значения из байта [], чтобы избежать отрицательных чисел из-за переполнения байтов
Заключение в кавычки при установке $FOO недостаточно. Необходимо заключить ссылку на переменную в кавычки также:
me$ FOO="BAR * BAR"
me$ echo "$FOO"
BAR * BAR
в КОРОТКОМ ОТВЕТЕ
Как другие было сказано - необходимо всегда заключать переменные в кавычки для предотвращения странного поведения. Так использование эхо "$foo" во вместо всего $foo эха .
ДЛИННЫЙ ОТВЕТ
я действительно думаю, что этот пример гарантирует дальнейшее объяснение, потому что там больше продолжается, чем это могло бы казаться на первый взгляд.
я вижу, где Ваш беспорядок входит потому что после выполнения первого примера, Вы, вероятно, думали себе, что оболочка, очевидно, делает:
Так от Вашего первого примера:
me$ FOO="BAR * BAR"
me$ echo $FOO
После того, как расширение параметра эквивалентно:
me$ echo BAR * BAR
И после того, как расширение имени файла эквивалентно:
me$ echo BAR file1 file2 file3 file4 BAR
И если Вы просто тип echo BAR * BAR
в командную строку Вы будете видеть, что они эквивалентны.
, Таким образом, Вы, вероятно, думали себе, "если я выхожу *, я могу предотвратить расширение имени файла"
Так от Вашего второго примера:
me$ FOO="BAR \* BAR"
me$ echo $FOO
После того, как расширение параметра должно быть эквивалентно:
me$ echo BAR \* BAR
И после того, как расширение имени файла должно быть эквивалентно:
me$ echo BAR \* BAR
И при попытке ввести "ПАНЕЛЬ эха \* ПАНЕЛЬ" непосредственно в командную строку, она действительно распечатает "ПАНЕЛЬ * ПАНЕЛЬ", потому что расширение имени файла предотвращено Escape.
Итак, почему использование $foo не работало?
Это - потому что существует третье расширение, которое происходит - Удаление Кавычки. От удара ручное удаление кавычки:
После предыдущих расширений, все неупомянутые случаи символов †\’, †'’, и †"’, который не следовал из одного из вышеупомянутых расширений, удалены.
Поэтому то, что происходит, - когда Вы вводите команду непосредственно в командную строку, символ ESC не является результатом предыдущего расширения, таким образом, Bash удаляет его прежде, чем отправить, это к команде эха, но в 2-м примере, "\*" был результат предыдущего расширения Параметра, таким образом, это НЕ удалено. В результате эхо получает "\*", и это - то, что оно печатает.
Примечание различие между первым примером - "*" не включено в символы, которые будут удалены Удалением Кавычки.
я надеюсь, что это имеет смысл. В конце заключение в том же - просто используют кавычки. Я просто думал, что объясню, почему выход, который логически должен работать, если только Параметр и расширение Имени файла приведены в действие, не работал.
Для полного объяснения расширений Bash, обратитесь к:
http://www.gnu.org/software/bash/manual/bashref.html#Shell-Expansions
Это может стоить выработать привычку использования printf
скорее затем echo
на командной строке.
В этом примере это не приносит много пользы, но это может быть более полезно с более комплексным выходом.
FOO="BAR * BAR"
printf %s "$FOO"