1. Pascal / Говнокод #10057

    +95

    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, 27 Апреля 2012

    Комментарии (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 как раз и есть указатель. А массив от стринга отличается только отсутствием ячейки с длиной, которая в данном случае не нужна.
              Ответить
            • > Для строчки берётся меньше ячеек в куче

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

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

              Тэээкс батенька, сишарпом давно болели?
              Ответить
              • char[] a = new char[500];
                for ( int i = 0; i < 500; i++)
                  a[i] = new char(0);
                Ответить
              • А какая разница машинке, что константа ей, что динмассив - в оперативке (куче системы) они одинаково лежат, без разницы Мбайты занимают, способ доступа и обращения лишь различен. Инфекция - Делфи.
                Ответить
                • А если нет разницы, то зачем платить больше, ведь такты и указатели не экономятся.
                  Ответить
                • Мы говорим о "массив символов или строка". Тут блять нету никаких динмассивов.
                  Ответить
                  • Надоело варить, хватит, вот определение 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

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

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

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

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