LINUX.ORG.RU
ФорумTalks

Вышел radix50conv 0.1 для кодировки Radix-50 (в варианте PDP-11/VAX)

 , , pdp-11, radix-50


0

1

Сабж. radix50conv умеет конвертировать из ASCII/KOI8-R в Radix-50 PDP-11/VAX и обратно:

> echo "Привет всему ЛОРу!" | wc -c
19
> echo "Привет всему ЛОРу!" | radix50conv > tmp0
> hexdump -C tmp0
00000000  66 d9 90 9c b2 ab 21 5d  b0 ef 73 e4 b3 7c        |fы░°╡╚!]╟ОsДЁ||
0000000e
> cat tmp0 | radix50conv d
PRIWET.WSEMU.LORU....>
> du -b tmp0
14      tmp0
>
> du -b tomsawyer.*
279228  tomsawyer.radix50
418842  tomsawyer.txt
>
Radix-50, напоминаю, - это кодировка из 40-ка символов (включая пробел) (40 в десятичной системе счисления равно 50 в восьмеричной системе счисления - отсюда и название), которая в каждые 2 байта (одно слово) помещает очередные 3 символа.
https://en.wikipedia.org/wiki/DEC_Radix-50

Скачать: http://saahriktu.org/downloads/radix50conv-0.1.tar.lzma

★★★★★

Последнее исправление: saahriktu (всего исправлений: 1)

Ответ на: комментарий от kirk_johnson

Кто «остальные» и что именно поняли?

Заметьте, я не утверждал, что, якобы, модуль совсем не рабочий. А если модуль рабочий, но что-то не срослось, то, определённо, у юзера слишком мало информации и ему нужно копать дальше.

saahriktu ★★★★★
() автор топика
Ответ на: комментарий от kirk_johnson

Потому, что Вы посмотрели на то, что выглядит как скрипт, не как на скрипт. При этом нигде не написано как именно надо на это смотреть. Поэтому те, кто смотрят на это как на скрипт, не совершают ошибки в строгом смысле этого слова. Это логично смотреть на последовательность строк, первые из которых начинаются с «use», как на Perl'овый скрипт. Если бы авторы манов и документации никогда бы не приводили рабочих примеров, а только краткую солянку из отдельных примеров наиболее важных строк, то, конечно, можно было бы говорить, что тот, кто смотрит на примеры не этим конкретным образом, просто никогда ничего не читал. Но, это не так.

saahriktu ★★★★★
() автор топика
Последнее исправление: saahriktu (всего исправлений: 1)
Ответ на: комментарий от saahriktu

Потому, что Вы посмотрели на то, что выглядит как скрипт, не как на скрипт. При этом нигде не написано как именно надо на это смотреть.

Лол. Я удивлен, как ты вообще дожил до этого момента.

kirk_johnson ★☆
()
Последнее исправление: kirk_johnson (всего исправлений: 1)
Ответ на: комментарий от saahriktu

В любом случае, я начал писать конвертер не поэтому. У того же модуля perl-rename есть утилита rename. И это очень удобно. Можно было, конечно, написать такую утилиту на Perl'е с использованием этого модуля. Но, можно и просто написать на Си.

saahriktu ★★★★★
() автор топика
Ответ на: комментарий от saahriktu

В любом случае, я начал писать конвертер не поэтому. У того же модуля perl-rename есть утилита rename. И это очень удобно. Можно было, конечно, написать такую утилиту на Perl'е с использованием этого модуля. Но, можно и просто написать на Си.

Только она у тебя работает через жопу:

$ printf 'test' | ./radix50conv | ./radix50conv decode
TEST..%
$ printf '#' | ./radix50conv | ./radix50conv decode
...%

Hint: в кодировке символ '.' есть.

kirk_johnson ★☆
()
Последнее исправление: kirk_johnson (всего исправлений: 1)
Ответ на: комментарий от saahriktu

У того же модуля perl-rename есть утилита rename

И она 1) является простой и понятной обёрткой вокруг File::Rename, а не куском полурабочего writeonly быдлокода, 2) документирована, 3) использует GetOpt, 4) использует стандартную сборочную систему, а не кривой нестандартный велосипед, 5) ну и самое главное — она решает востребованную задачу, а не является абсолютно бесполезной вещью.

redgremlin ★★★★★
()
Последнее исправление: redgremlin (всего исправлений: 1)
Ответ на: комментарий от redgremlin

Вот, кстати, кошерный Makefile :)

PROGRAM  = radix50conv
PREFIX  ?= /usr/local
CFLAGS  += -Wall -Wextra -MD

-include *.d

$(PROGRAM): # IMPLICIT RULES BITCHES

clean:
	rm -f $(PROGRAM) $(PROGRAM).d

install:
	install -D -m 0755 $(PROGRAM) $(DESTDIR)$(PREFIX)/bin/$(PROGRAM)

.PHONY: clean install

P.S. Сразу вылезло, что argv неправильного типа xD

kirk_johnson ★☆
()
Последнее исправление: kirk_johnson (всего исправлений: 7)
Ответ на: комментарий от kirk_johnson

Hint: в кодировке символ '.' есть.

И именно поэтому он используется кодировщиком вместо отсутствующих в кодировке символов. А вот символа '#' в Radix-50, как уже говорилось выше, нет. Поэтому кодировщик его заменяет точкой. И добавляет ещё две точки вместо отсутствующих 2-х символов (кодирование происходит, напоминаю, по 3 символа).

saahriktu ★★★★★
() автор топика
Ответ на: комментарий от redgremlin

1) является простой и понятной обёрткой вокруг File::Rename

Не всем и не всегда нужны просто обёртки. Иногда нужен и дополнительный функционал.

2) документирована, 3) использует GetOpt, 4) использует стандартную сборочную систему

Не всем это нужно.

saahriktu ★★★★★
() автор топика
Ответ на: комментарий от saahriktu

И именно поэтому он используется кодировщиком вместо отсутствующих в кодировке символов.

Именно поэтому у тебя входные данные '###############' и '...............' выдадут одинаковый результат при декодировании. То есть для двух разных наборов данных у тебя одинаковый набор выходных. П - Парсинг.

А вот символа '#' в Radix-50, как уже говорилось выше, нет. Поэтому кодировщик его заменяет точкой. И добавляет ещё две точки вместо отсутствующих 2-х символов (кодирование происходит, напоминаю, по 3 символа).

То есть невалидные данные у тебя кодируются как валидные, но другие. К - Кодирование.

P.S. А вот автор «странно написанного модуля» все делает правильно и вместо невалидных данных показывает '?'.

kirk_johnson ★☆
()
Последнее исправление: kirk_johnson (всего исправлений: 4)
Ответ на: комментарий от kirk_johnson

П - Парсинг.
К - Кодирование.

В самой Radix-50 конкретному набору ASCII символов соответствует только один конкретный набор данных. А вот мой кодировщик, как я уже упоминал выше, более близок к практическому применению чем тот Perl'овый модуль, поскольку позволяет кодировать в т.ч. и отсутствующие в Radix-50 символы. Латиница в нижнем регистре автоматически приводится к верхнему (в нижнем в Radix-50 её нет), а кириллица проходит транслитерацию через искоробочное KOI8-R -> ASCII преобразование с этим же самым приведением к верхнему регистру. Т.е. это не в само кодирование подставляется разное с одинаковым результатом, а перед самим кодированием буквы приводятся к латинице в верхнем регистре.

saahriktu ★★★★★
() автор топика
Последнее исправление: saahriktu (всего исправлений: 3)
Ответ на: комментарий от saahriktu

В самой Radix-50 конкретному набору ASCII символов существует только один соответствующий набор данных. А вот кодировщик, как я уже упоминал выше, более близок к практическому применению чем тот Perl'овый модуль, поскольку позволяет кодировать в т.ч. и отсутствующие в Radix-50 символы. Латиница в нижнем регистре автоматически приводится к верхнему (в нижнем в Radix-50 её нет), а кириллица проходит транслитерацию через искоробчное KOI8-R -> ASCII преобразование с этим же самым приведением к верхнему регистру. Т.е. это не в само кодирование подставляется разное с одинаковым результатом, а перед самим кодированием буквы приводятся к латинице в верхнем регистре.

Я тебе только что привел пример, когда я твоей «программе» кормлю невалидный вход, а она выдает мне валидный выход. В то время, как автор Encode::RAD50 правильно приводит нижний к верхнему и осуществляет трансляцию в рамках заявленной спецификации.

P.S. Кстати, твоя программа — комбайн. Она одновеременно и кодировщик (ascii subset -> rad50) и транслятор (fullblown ascii / koi8-r -> ascii subset).

kirk_johnson ★☆
()
Последнее исправление: kirk_johnson (всего исправлений: 1)
Ответ на: комментарий от kirk_johnson

Моя программа - текстовый фильтр для уже существующих текстов. Поэтому ей положено выполнять почти туже самую работу, что выполняет «iconv -c». Только iconv -c совсем срезает символ, а моя программа заменяет его точкой. И это лучше чем фэйл и «идите переделывать текст». В то время как в самом тексте, по сути, и так ASCII, но со смещением по таблице.

saahriktu ★★★★★
() автор топика
Ответ на: комментарий от saahriktu

Моя программа - текстовый фильтр для уже существующих текстов. Поэтому ей положено выполнять почти туже самую работу, что выполняет «iconv -c».

Нет. Согласно UNIX-way положено иметь библиотеку (которую уже написал автор) и транслятор (использующий библиотеку). Ты это нарушил. Ты комбайнер и не следуешь UNIX-way >:3

Конкретно, ты нарушил вот эти два пункта:

  • Извлекайте пользу из уже существующих программных решений.
  • Используйте скриптовые языки для уменьшения трудозатрат и улучшения переносимости.

Только iconv -c совсем срезает символ, а моя программа заменяет его точкой. И это лучше чем фэйл и «идите переделывать текст».

Автор Encode::RAD50 заменяет невалидный символ на '?', а ты вносишь искажения в парсинг. Юзер считает, что данные валидны, а на самом деле нет >:3

В то время как в самом тексте, по сути, и так ASCII, но со смещением по таблице.

В самом тексте ограниченный набор ASCII, который ты не осилил поддержать по-человечески >:3

kirk_johnson ★☆
()
Последнее исправление: kirk_johnson (всего исправлений: 3)
Ответ на: комментарий от kirk_johnson

Согласно UNIX-way положено иметь библиотеку

Это частный случай. Можно было, конечно, реализовать отдельно утилиту koi8rtoascii и склеивать их скриптом. Но, по сути, спор всего о 2-х (!) строчках кода (они там ещё помечены комментарием). При этом, если скармливать кодировщику только имеющиеся в Radix-50 символы, то условия в тех 2-х строчках выполнены не будут и программа просто пойдёт дальше.

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

saahriktu ★★★★★
() автор топика
Ответ на: комментарий от saahriktu

Это частный случай. Можно было, конечно, реализовать отдельно утилиту koi8rtoascii и склеивать их скриптом. Но, по сути, спор всего о 2-х (!) строчках кода (они там ещё помечены комментарием). При этом, если скармливать кодировщику только имеющиеся в Radix-50 символы, то условия в тех 2-х строчках выполнены не будут и программа просто пойдёт дальше.

И в этих двух строчках ты умудрился обосраться :D

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

Это ты сейчас о том, что, в отличии от Encode::RAD50, твоя «программа» никак не документирована и может кодировать невалидные символы в валидные? :D

Вот тебе выдержка из DESCRIPTION, чтобы ты понял, что от твоей «программы» хотят видеть пользователи:

This package is designed to convert to and from the Rad50 character set. It's really a piece of retrocomputing, since this character set was, to the best of my knowledge, only used for the Digital (R.I.P.) PDP-11 computer, under (at least) the RSX-11 (including IAS and P/OS), RT-11, RSTS (-11 and /E) operating systems.

Rad50 is a way to squeeze three characters into two bytes, by restricting the character set to upper-case 7-bit ASCII letters, digits, space, "." and «$». There is also an encoding for what was called «the illegal character.» In the language of the Encode modules this is the substitution character, and its ASCII representation is "?".

When more than three characters are encoded, the first three go in the first two bytes, the second three in the second two, and so on. If you try to encode some number of characters other than a multiple of three, implicit spaces will be added to the right-hand end of the string. These will become explicit when you decode.

kirk_johnson ★☆
()
Последнее исправление: kirk_johnson (всего исправлений: 4)
Ответ на: комментарий от kirk_johnson

Автор Encode::RAD50 заменяет невалидный символ на '?', а ты вносишь искажения

Представить в Radix-50 можно только имеющийся в ней символ. А здесь мы говорим именно про представление в Radix-50. Конвертор в Radix-50 может ругаться (но, это будет менее применимо практически, поскольку юзеру важно получить его книгу/статью/мануал/etc в Radix-50) или не ругаться, а вот декодеру ругаться уже нет смысла, поскольку у него уже целая ASCII, в которой больше символов чем в Radix-50 и нет такого символа Radix-50, который был бы невалидным для ASCII.

В самом тексте ограниченный набор ASCII

А вот здесь мы говорим не о представлении в Radix-50, а о начальном представлении в ASCII/KOI8-R.

saahriktu ★★★★★
() автор топика
Последнее исправление: saahriktu (всего исправлений: 1)
Ответ на: комментарий от saahriktu

Представить в Radix-50 можно только имеющийся в ней символ. А здесь мы говорим именно про представление в Radix-50. Конвертор в Radix-50 может ругаться (но, это будет менее применимо практически, поскольку юзеру важно получить его книгу/статью/мануал/etc в Radix-50) или не ругаться, а вот декодеру ругаться уже нет смысла, поскольку у него уже целая ASCII, в которой больше символов чем в Radix-50 и нет такого символа Radix-50, который был бы невалидным для ASCII.

Какая часть этой фразы тебе непонятна:

There is also an encoding for what was called «the illegal character.» In the language of the Encode modules this is the substitution character, and its ASCII representation is "?".

Чувак, ты уже такую кучу наложил в штаны, что продолжать дальше просто бессмысленно.

kirk_johnson ★☆
()
Последнее исправление: kirk_johnson (всего исправлений: 1)
Ответ на: комментарий от kirk_johnson

Нет, это Вы не понимаете о чём говорите. Автор модуля мог там сделать что угодно если у него есть промежуточное представление для вывода в stdout. У меня же просто текстовый фильтр. ASCII/KOI8-R <-> Radix-50. Берём ASCII/KOI8-R, получаем Radix-50. Берём Radix-50, получаем ASCII. Для ASCII «illegal character'ов» не существует. Автор пишет про «illegal character'ы» для Radix-50. Но, у моего конвертера сразу конкретный символ Radix-50. Один из 40-ка корректных. Я не писал никаких модулей чтобы баловаться с перекодированием в stdout. Я сразу написал серьёзный конвертер для файлов. Такой, что ругань для него никакого смысла не имеет. Он просто сохраняет в Radix-50 всё, что можно в ней сохранить, а потом извлекает оттуда обратно.

saahriktu ★★★★★
() автор топика
Ответ на: комментарий от saahriktu

Нет, это Вы не понимаете о чём говорите. Автор модуля мог там сделать что угодно если у него есть промежуточное представление для вывода в stdout. У меня же просто текстовый фильтр. ASCII/KOI8-R <-> Radix-50. Берём ASCII/KOI8-R, получаем Radix-50.

Ну, автор перлового модуля получает, да. А ты в этом месте не вставил проверку на корректность трансляции и обосрался.

Автор пишет про «illegal character'ы» для Radix-50. Но, у моего конвертера сразу конкретный символ Radix-50. Один из 40-ка корректных.

Поскольку ты ламер, то не знаешь, что корректных только 39 :)

Я не писал никаких модулей чтобы баловаться с перекодированием в stdout. Я сразу написал серьёзный конвертер для файлов.

Интернеты — серьезный бизнес.

kirk_johnson ★☆
()
Ответ на: комментарий от kirk_johnson

ты в этом месте не вставил проверку на корректность трансляции

Нет, это Вы продолжаете не понимать о чём говорите. Проверки проверками, но у меня конкретная функция asciitoradixfifty(), которая возвращает код символа Radix-50, который должен быть упакован. Допустим, она вернёт -1 или ещё какое-то другое значение для обозначения ошибки. Ну, а дальше что? Алгоритму нужно паковать. Ему фиолетово кто там что считает корректным или некорректным. Ему нужно конкретное корректное значение одного из символов Radix-50, иначе оно просто не упакуется.

корректных только 39

Нет, не 39. 0-й символ - пробел, 'A' - 1-й символ, а '9' - 39-й. Да, могут быть разные вариации Radix-50, в т.ч. когда, например, 29-й символ зарезервирован. Но, он всё равно продолжает оставаться корректным для кодировки.

saahriktu ★★★★★
() автор топика
Ответ на: комментарий от saahriktu

Нет, это Вы продолжаете не понимать о чём говорите. Проверки проверками, но у меня конкретная функция asciitoradixfifty(), которая возвращает код символа Radix-50, который должен быть упакован.

Гм... На самом деле, отличная отмаза. Я не обрабатываю ошибки, потому что у меня тут функция asciitoradixfifty(). Я бы тоже не стал, будь у меня такая функция.

Допустим, она вернёт -1 или ещё какое-то другое значение для обозначения ошибки. Ну, а дальше что? Алгоритму нужно паковать. Ему фиолетово кто там что считает корректным или некорректным. Ему нужно конкретное корректное значение одного из символов Radix-50, иначе оно просто не упакуется.

Я все жду, когда до тебя дойдет, что не все 40 символов — валидные :)

Нет, не 39. 0-й символ - пробел, 'A' - 1-й символ, а '9' - 39-й. Да, могут быть разные вариации Radix-50, в т.ч. когда, например, 29-й символ зарезервирован. Но, он всё равно продолжает оставаться корректным для кодировки.

У меня ощущение, что ты просто не умеешь читать:

For example, the RT-11 operating system considered the character corresponding to value 011101 to be undefined.

kirk_johnson ★☆
()
Ответ на: комментарий от kirk_johnson

не обрабатываю ошибки

Что значит «ошибки»? Советую перечитать всё с самого начала. Да, в ASCII/KOI8-R есть символы, которых нет в Radix-50. Но, при чём здесь ошибки? Главное - передавать на кодирование именно то, что поддаётся кодированию, а остальное отсеивать. Кто-то мог бы реализовать через 2 отдельных функции, одна из которых выполняет отсеивание перед кодированием. Тогда это было бы более наглядно. Но, оно спокойно реализовывается и одной функцией, которая все возможные входные варианты сводит к одному из конкретных 40-ка символов Radix-50.

не все 40 символов — валидные

Нет, все. Поведение ОС RT-11 - это поведение ОС RT-11. Сама кодировка так потому и называется, что в ней 40 символов. Если бы в ней было только 39 символов, то она бы называлась Radix-47.

saahriktu ★★★★★
() автор топика
Ответ на: комментарий от saahriktu

Главное - передавать на кодирование именно то, что поддаётся кодированию, а остальное отсеивать.

Kek. Да, только ты почему-то не отсеиваешь, а превращаешь в другие символы и пихаешь в файл :D

Нет, все. Поведение ОС RT-11 - это поведение ОС RT-11. Сама кодировка так потому и называется, что в ней 40 символов. Если бы в ней было только 39 символов, то она бы называлась Radix-47.

В ней 39 валидных и 1 невалидный, лол. Ты ещё и складывать не умеешь?

kirk_johnson ★☆
()
Ответ на: комментарий от kirk_johnson

только ты почему-то не отсеиваешь

        if (achar < 32 || achar > 122)
                return 28;
...
        return 28;
}

1 невалидный

Невалидный для ОС RT-11, а не для Radix-50. От того, что она считает конкретный код символа неопределённым, он никуда не исчезает. Точно также можно дорассуждаться, например, что в ASCII меньше чем 127 символов и ряд из них (из числа контрольных) - невалидные. Тем не менее, коды символов никуда не исчезают и не могут быть невалидными для той кодировки, в которой они есть.

saahriktu ★★★★★
() автор топика
Ответ на: комментарий от neuer_Reedych

Можно gopher ссылку? А то я в 1991, нету http.

gopher://sdf.org/9/users/saahriktu/saahriktu.org/radix50conv-0.1.tar.lzma

saahriktu ★★★★★
() автор топика
29 декабря 2019 г.
Ответ на: комментарий от saahriktu

Для совместимости с ARM'ами, где char беззнаковый, а потому нет возможности отслеживать отрицательный EOF.

Ничто не мешает явно написать написать signed char - тогда точно знаковый будет

SZT ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.