В последнее время существует другой способ - используя API-интерфейс Glid's Generated API . Это требует некоторой начальной работы, но затем дает вам всю мощь Glide с гибкостью, чтобы что-либо сделать, потому что вы пишете фактический код, поэтому я считаю, что это хорошее решение для долгосрочного использования. Кроме того, использование очень простое и аккуратное.
Сначала установите Glide version 4 +:
implementation 'com.github.bumptech.glide:glide:4.6.1'
annotationProcessor 'com.github.bumptech.glide:compiler:4.6.1'
Затем создайте класс модуля приложения Glid для запуска обработка аннотации:
@GlideModule
public final class MyAppGlideModule extends AppGlideModule {}
Затем создайте расширение Glide, которое фактически выполняет работу. Вы можете настроить его так, как хотите:
@GlideExtension
public class MyGlideExtension {
private MyGlideExtension() {}
@NonNull
@GlideOption
public static RequestOptions roundedCorners(RequestOptions options, @NonNull Context context, int cornerRadius) {
int px = Math.round(cornerRadius * (context.getResources().getDisplayMetrics().xdpi / DisplayMetrics.DENSITY_DEFAULT));
return options.transforms(new RoundedCorners(px));
}
}
После добавления этих файлов создайте свой проект.
Затем используйте его в своем коде следующим образом:
GlideApp.with(this)
.load(imageUrl)
.roundedCorners(getApplicationContext(), 5)
.into(imageView);
Самый легкий должен просто взять 8 последовательных символов, превратить их в байт и произвести тот байт. Клавиатура с нулями в конце, если можно распознать конец потока или добавить заголовок с длиной (в битах) в начале файла.
Внутренний цикл посмотрел бы что-то как:
byte[] buffer = new byte[ ( string.length + 7 ) / 8 ];
for ( int i = 0; i < buffer.length; ++i ) {
byte current = 0;
for ( int j = 7; j >= 0; --j )
if ( string[ i * 8 + j ] == '1' )
current |= 1 << j;
output( current );
}
Необходимо будет внести некоторые корректировки, но это - общее представление.
Если Вы удачливы, java.math. BigInteger может сделать все для Вас.
String s = "11001010001010101110101001001110";
byte[] bytes = (new java.math.BigInteger(s, 2)).toByteArray();
Это действительно зависит от порядка байтов (обратный порядок байтов) и выравнивающий по правому краю (если число битов не является несколькими из 8), являющийся, что Вы хотите, но может быть более просто изменить массив впоследствии, чем сделать преобразование символов сами.
Принятие Строки имеет несколько восемь битов, (можно заполнить его иначе), используйте в своих интересах Java, создал в парсинге в методе Integer.valueOf, чтобы сделать что-то вроде этого:
String s = "11001010001010101110101001001110";
byte[] data = new byte[s.length() / 8];
for (int i = 0; i < data.length; i++) {
data[i] = (byte) Integer.parseInt(s.substring(i * 8, (i + 1) * 8), 2);
}
Затем необходимо смочь записать байты в a FileOutputStream
симпатичный просто.
С другой стороны, если Вы ищущий эффективность, необходимо полагать, что не использование Строки хранит биты для начала, но создает байты непосредственно в компрессоре.
public class BitOutputStream extends FilterOutputStream
{
private int buffer = 0;
private int bitCount = 0;
public BitOutputStream(OutputStream out)
{
super(out);
}
public void writeBits(int value, int numBits) throws IOException
{
while(numBits>0)
{
numBits--;
int mix = ((value&1)<<bitCount++);
buffer|=mix;
value>>=1;
if(bitCount==8)
align8();
}
}
@Override
public void close() throws IOException
{
align8(); /* Flush any remaining partial bytes */
super.close();
}
public void align8() throws IOException
{
if(bitCount > 0)
{
bitCount=0;
write(buffer);
buffer=0;
}
}
}
И затем...
if (nextChar == '0')
{
bos.writeBits(0, 1);
}
else
{
bos.writeBits(1, 1);
}