Не каждый случайный байтовый массив является допустимым UTF-8. на самом деле, я бы сказал, что немногие из них. Таким образом, при создании строки у вас будут некоторые символы, преобразованные в U + FFFD, что сигнализирует об ошибке при определении исходных байтов. Тогда они, конечно, будут выглядеть по-разному при преобразовании обратно в байты.
Если вы хотите получить чистую информацию в оба конца, не вводите данные, которые не действительны. Или вместо этого вы можете использовать кодировку, например Latin-1, где каждый байт действителен и, следовательно, остается неизменным. Но, как правило, вставка случайных данных, не являющихся текстом, в строку редко бывает полезной или хорошей идеей. Это не C, где нет различия между двоичными данными и текстом.