Школоло / Говнокод #10057 Ссылка на оригинал

0

  1. 1
  2. 2
  3. 3
  4. 4
  5. 5
  6. 6
function bth(ds: byte): string;
 const
 b: string = '0123456789ABCDEF';
begin
Result:= b[(ds shr 4) + 1] + b[(ds and $F) + 1];
end;

Некоторое время назад потребовалось конвертить Byte в Hex. Стандартных способов не нашёл, а ничего лучше такой говнокодки выдумать не получилось. Сейчас смотрю и разбирает смех - весёлые были времена!

Запостил: Alegun Alegun, (Updated )

Комментарии (38) RSS

  • стандартно format('%x', [ds])
    если нужно очень быстро, то Result := '00'; а далее задавать оба символа как Result[1] := ....
    Ответить
  • s := IntToHex(ds, 2);
    Но этот способ тоже вполне годный, у меня на С для PIC такая функция, т.к. на printf памяти не хватает.
    Ответить
    • Хоть и с задержкой в несколько дней, но всё же... Спасибо Вам огромное за подсказку, в результате которой сабжевый ГК мутировал в другой, менее извратный:
      function bth(ds: array of byte): integer;
      var
      i: integer;  
      s: string;
        begin
        s:= '$';  
        for i := Low(ds) to High(ds) do  
             s:= s + IntToHex(ds[i], 2);
      Result:= StrToInt(s);
      end;

      Конечная сборка сократилась строк на 30 и это сильно радует 🙂 Самому додуматься до очевидного использования IntToHex видно было несудьба, Вам ещё раз многократное, с эхом, спс за расширение кругозора!
      Ответить
  • Ну мой велосипед так же работает. С той разницей, что
    const b: array [0..15] of char = '0123456789ABCDEF';
    и тогда не надо прибавлять единицу
    Нормальный конвертёр, говна не вижу. Интересного в коде тоже не вижу. Минус.
    Ответить
    • А мой велосипед был без магической константы:
      Result:= chr($30 + (ds shr 4) + 7 * ord (ds shr 4 > 9))
          +  chr($30 + (ds and $F) + 7 * ord (ds and $F > 9));
      Ответить
      • >без магической константы
        Я тут 5 магических констант насчитал.
        Ответить
        • А если так:
          Result:= chr(ord('0') + (ds shr Red) + LightGray * ord (ds shr Red > LightBlue))
              +  chr(ord('0') + (ds and White) + LightGray * ord (ds and White > LightBlue));
          Ответить
          • Result:= chr(ord('0') + (ds shr WS_EX_NOPARENTNOTIFY) + WM_SETFOCUS * ord (ds shr WS_EX_NOPARENTNOTIFY > WS_EX_DLGMODALFRAME or WS_EX_TOPMOST))
                +  chr(ord('0') + (ds and WM_PAINT) + WM_SETFOCUS * ord (ds and WM_PAINT > WS_EX_DLGMODALFRAME or WS_EX_TOPMOST));
            Ответить
            • Осталось только ord('0') заменить. Например, Str(ord(false), x), а вместо '0' подставить x.

              Для четвёрки логичная замена такая: sizeof(Byte) shr ord(true).

              False и true в свою очередь можно заменить произвольным выражением со сравнением.
              Ответить
    • Такой варьянт тож рассматривался, но... создавать массив чарок как-то было не айс, стрингой показалось проще и экологичнее.
      Ответить
      • А в чём разница? Кроме индексации, которая у массива в данном случае удобнее.
        Ответить
        • Для строчки берётся меньше ячеек в куче - длина строки в начале плюс сама строка, а для массива чарок создаётся и указатель и сами чарки, не экономно, да и такты вроде проца берегутся. Если только PChar использовать. Самое смешное, как потом эта функца использовалась: двойное преобразование так и делалось - i:= StrToInt('$' + bth(byte1) + bth(byte2) +итд); все доэтошние попытки экономии шли прахом, веселуха.
          Ответить
          • > да и такты вроде проца берегутся
            Техническое обоснование в студию.

            > Если только PChar использовать.
            PChar как раз и есть указатель. А массив от стринга отличается только отсутствием ячейки с длиной, которая в данном случае не нужна.
            Ответить
          • > Для строчки берётся меньше ячеек в куче

            Какая нахуй куча, это константы.

            > а для массива чарок создаётся и указатель и сами чарки

            Тэээкс батенька, сишарпом давно болели?
            Ответить
            • А какая разница машинке, что константа ей, что динмассив - в оперативке (куче системы) они одинаково лежат, без разницы Мбайты занимают, способ доступа и обращения лишь различен. Инфекция - Делфи.
              Ответить
              • А если нет разницы, то зачем платить больше, ведь такты и указатели не экономятся.
                Ответить
              • Мы говорим о "массив символов или строка". Тут блять нету никаких динмассивов.
                Ответить
                • Надоело варить, хватит, вот определение nullterminated string из system.pas:
                  type
                  StrRec = record
                  allocSiz: Longint;
                  refCnt: Longint;
                  length: Longint;
                  end;

                  А это выдержка из ДРКБ:

                  Тип String: по смещению -4 храниться длина строки, по смещению -8 храниться счётчик ссылок на строку (когда он обнуляется строка уничтожается) Сама строка располагается в памяти как есть - каждая буква занимает 1 байт...

                  PChar - длина строки определяется от начала до #0 байта, по сути это чистой воды pointer, так что все действия по отслеживанию распределения памяти лежат на программисте - сами заботьтесь о том чтобы хватило места для распределения памяти и освобождении после использования. Тоже одна буква = 1 байт...

                  Самая хохма - в использовании данной функции, пример приведён выше, а это никто и не заметил.
                  Ответить
                  • болван, это дельфевая вариация на тему std::string
                    а твоя константа не в куче, а в .data

                    > храниться
                    DRKB такое DRKB

                    нубовская реализация неговна
                    Ответить
                  • Где тут блять написано, что константная строка (или статический массив) храниться в куче? Я блять знаю как устроены строки в дельфи и я знаю, что они занимают аж на целых 8 байт больше места, чем просто статический массив.
                    Ответить
                    • Ну и отлично, со строками покончено. Это наверное сленг такой, но на всякий случай тож замечу - нехорошее словцо-междометье, используемое Вами, увж. Гость через д пишется 🙂
                      Ответить
                      • Это был я, с другого компа заходил. Через д - это женщина лёгкого поведения.
                        Ответить
                        • Лишние варианты написания плодить ни к чему. Пусть безобразно, зато однообразно.
                          Ответить
                          • Согласен на все сто, по ходу срачки возник вопрос: кто знает как можно группу из 8 байтов преобразовать в integer более менее цивилизованным способом, не прибегая к изврату типа преобразования в строку, а только затем в интеджер?
                            Ответить
                              • Есть другие варианты:
                                1. Отобразить integer на байтовый массив с помощью синтаксиса приведения типа и заполнить его поэлементно.

                                2. Привести каждый байт к integer, далее сдвиги влево и логическое ИЛИ.

                                Эти два варианта интересны тем, что не используют указатели.
                                Ответить
                            • Косноязычие — враг Ваш. Группу из 8 байт можно преобразовать в integer с помощью любых арифметических операций.
                              Ответить
  • Спасибо огромное всем за комменты, было очень интересно узнать мнение отдельных товарищей, бодрит, подчерпнул много нового, веселит, спасибо всем вам!
    Ответить

Добавить комментарий

Я, guest, находясь в здравом уме и твердой памяти, торжественно заявляю:

    А не использовать ли нам bbcode?


    8