:: Visual Foxpro, Foxpro for DOS
Поменять тетрады в байте во всей строке
AngelOKES

Сообщений: 828
Дата регистрации: 08.02.2012
Есть строка 0h005363000408313131313131
1) Нужно посчитать CRC и прибавить к строке - эта часть реализована, проблем нет!
2) Полученную строку нужно переделать так что поменять тетрады в каждом байте и привести к виду: 0h00353600408013131313131313 и CRC тоже надо перевернуть
3) Переделать строку так, чтобы каждая тетрада передавалась в соответствие шестнадцатеричному коду тетрады ставится ASCII– символ. Так, кодам 0…9 будут соответствовать значения 0x30…0x39, кодам A…F - значения 0x41…0x46
получится должно что-то типа 0h30303335333630303430383031333133313331333133133 + CRC по такой же схеме
Ratings: 0 negative/0 positive
Re: Поменять тетрады в байте во всей строке
akvvohinc
Автор

Сообщений: 4224
Откуда: Москва
Дата регистрации: 11.11.2008
s = 0h005363000408313131313131
? TRANSFORM(s,'@0')
Получив исходную строку в виде 16-ричных символов, можно "переворачивать" тетрады и далее всё, что требуется.

Можно использовать и BIT-операции прямо над кодами символов, например:
c = 0h21
c1 = BITRSHIFT(ASC(c),4) && код левой тетрады = 2
c2 = ASC(BITCLEAR(c,4,4)) && код правой тетрады = 1
Далее их остается только "перевернуть" и превратить в новый символ:
c_new = CHR(BITOR(BITLSHIFT(c2,4),c1))



Исправлено 8 раз(а). Последнее : akvvohinc, 04.10.21 15:01
Ratings: 0 negative/0 positive
Re: Поменять тетрады в байте во всей строке
AngelOKES

Сообщений: 828
Дата регистрации: 08.02.2012
Немного переделал:
lcData2=''
For ii=1 To Len(lcData)
m1=Substr(lcData, m.ii, 1)
c1 = Bitrshift(Asc(m1),4) && код левой тетрады = 2
c11 = Iif(c1>9,c1+55,c1+48)
c2 = Asc(Bitclear(m1,4,4)) && код правой тетрады = 1
c22 = Iif(c2>9,c2+55,c2+48)
lcData2=lcData2+0h+Chr(c22)+Chr(c11)
Next
Вроде получилось то что надо, но это не точно)))
Ratings: 0 negative/0 positive
Re: Поменять тетрады в байте во всей строке
akvvohinc
Автор

Сообщений: 4224
Откуда: Москва
Дата регистрации: 11.11.2008
AngelOKES
Вроде получилось то что надо, но это не точно)))

Поскольку между исходными и выходными символами есть однозначное соответствие, то достаточно один раз для каждого возможного символа (его кода) определить символ (его код), в который он должен превратиться в результате "преобразования" (пусть даже сделать это вручную ), а далее выполнять это преобразование одной командой для всей строки, не опасаясь ошибок в алгоритме:
s_new = CHRTRAN(s_old,<исходная строка символов>,<выходная строка символов> )



Исправлено 1 раз(а). Последнее : akvvohinc, 05.10.21 11:33
Ratings: 0 negative/0 positive
Re: Поменять тетрады в байте во всей строке
AngelOKES

Сообщений: 828
Дата регистрации: 08.02.2012
akvvohinc
AngelOKES
Вроде получилось то что надо, но это не точно)))

Поскольку между исходными и выходными символами есть однозначное соответствие, то достаточно один раз для каждого возможного символа (его кода) определить символ (его код), в который он должен превратиться в результате "преобразования" (пусть даже сделать это вручную ), а далее выполнять это преобразование одной командой для всей строки, не опасаясь ошибок в алгоритме:
s_new = CHRTRAN(s_old,<исходная строка символов>,<выходная строка символов> )

не подойдёт, там может быть что угодно, там конечно конечный вариант немного больше, но самое главное работает быстро
теперь буду разбор ответа писать, там свой геммор и кстати вот там такая функция вполне подойдёт, запустить её 16 раз и будет то что нужно
Ratings: 0 negative/0 positive
Re: Поменять тетрады в байте во всей строке
akvvohinc
Автор

Сообщений: 4224
Откуда: Москва
Дата регистрации: 11.11.2008
Цитата:
не подойдёт, там может быть что угодно

Неужели больше 256 символов?

Цитата:
запустить её 16 раз и будет то что нужно

А одного раза недостаточно?



Исправлено 1 раз(а). Последнее : akvvohinc, 05.10.21 12:36
Ratings: 0 negative/1 positive


Извините, только зарегистрированные пользователи могут оставлять сообщения в этом форуме.

On-line: 46 (Гостей: 46)

© 2000-2024 Fox Club 
Яндекс.Метрика