Побитовая обработка и вывод в Java

В последнее время существует другой способ - используя 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);

5
задан Dave L. 19 September 2008 в 20:53
поделиться

4 ответа

Самый легкий должен просто взять 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 );
}

Необходимо будет внести некоторые корректировки, но это - общее представление.

6
ответ дан 18 December 2019 в 12:03
поделиться

Если Вы удачливы, java.math. BigInteger может сделать все для Вас.

String s = "11001010001010101110101001001110";
byte[] bytes = (new java.math.BigInteger(s, 2)).toByteArray();

Это действительно зависит от порядка байтов (обратный порядок байтов) и выравнивающий по правому краю (если число битов не является несколькими из 8), являющийся, что Вы хотите, но может быть более просто изменить массив впоследствии, чем сделать преобразование символов сами.

6
ответ дан 18 December 2019 в 12:03
поделиться

Принятие Строки имеет несколько восемь битов, (можно заполнить его иначе), используйте в своих интересах 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 симпатичный просто.

С другой стороны, если Вы ищущий эффективность, необходимо полагать, что не использование Строки хранит биты для начала, но создает байты непосредственно в компрессоре.

1
ответ дан 18 December 2019 в 12:03
поделиться
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);
}
2
ответ дан 18 December 2019 в 12:03
поделиться
Другие вопросы по тегам:

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