Слова, заканчивающиеся на "m" в шестнадцатеричном, заканчиваются тем, что были повреждены удалением возврата каретки - PullRequest
0 голосов
/ 30 января 2020

Кажется, я не могу найти разумного обходного пути или исправить удаление "0d" "\ r" из строки, не нарушая при этом строку hexidemical.

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

Type | Food | Flavour
Cold | Ice Cream | Mint
Warm | Pudding | Chocolate

После отправки это затем записывается в текстовый файл в шестнадцатеричном формате.

436f6c64 49636520437265616d 4d696e74
5761726d 50756464696e67 43686f636f6c61746520

Собственно, из-за природы новой строки текстовой области HTML, когда вы публикуете форму, текстовая область добавляет возврат каретки "CR" или "0d" (в шестнадцатеричном формате) в конец строки. Как и было задумано.

Например, когда строка «Мороженое» собрана из необработанного ввода и преобразована в гекс: Ice Cream становится 49636520437265616d 0d Pudding становится 50756464696e67 0d и т. Д.

Таким образом, я удаляю это (0d), однако далее идет запись в файл. У меня есть al oop, который разбивает каждое введенное значение со страницы HTML на новую строку "\ n"

proc crystalEditor::save {} {
set i "0"
set formType [getFormValue type] ;#this contains the first textArea HTML element text #should be value: cold
set formFood [getFormValue food] ;#second textArea HTML element text #should be value: Ice Cream
set formFlavour [getFormValue flavour] ;#third textArea HTML element text #should be value: Mint

foreach formPost $formFood {
set foodType [2Hex [lindex [split $formType \n] $i]] ;#convert the whole entry to hex then
set foodFood [2Hex [lindex [split $formFood \n] $i]] ;#split the line by newline
set foodFlavour [2Hex [lindex [split $formFlavour \n] $i]] 
crystalEditor::hexWrite "$crystalEditor::myHexFiles/$fileName" "$foodType" "$foodFood" "$foodFlavour"
incr i
} ;#end foreach
crystalEditor::home [hex "$crystalEditor" "$crystalEditor::myHexFiles/$fileName"] ;#Load the HTML template with the hexFile
} ;#end procedure

Так выглядит процедура crystalEditor.

proc crystalEditor::hexWrite {myPath foodType foodFood foodFlavour} {

set foodType [string trimright $foodType 0d] ;#remove \r from hex string
set foodFood [string trimright $foodFood 0d] ;#otherwise on load, 
set foodFlavour [string trimright $foodFlavour 0d]

set fp [open "$myPath" a]
puts $fp "$foodType $foodFood $foodFlavour"
close $fp
} ;#end procedure

Процедура 2Hex такова:

proc 2Hex { text } { 
binary encode hex [encoding convertto utf-8 "$text"] 
} ;#end procedure

и процедура получения значений формы:

proc getFormValue {formName}
[ns_set get [ns_getform] $formName] ;#$formName is the formName in the HTML page.
} ;#end procedure

Таким образом, она работает с любой записью, если слово не заканчивается на «m».

Причина этого в том, что шестнадцатеричная буква "m" - это "6d", а потому что "0d", обозначающий \ r (возврат каретки), удаляется синтаксисом

[string trimright $someValue 0d]

в этом случае он также удаляет шестнадцатеричное десятичное число «d» из строки или шестнадцатеричную строку «Ice Cream». Я пробовал много других способов, но ни один из них не работает.

Итак Мороженое (43 72 65 61 6d) становится Ice Crea (43 72 65 61 6 ), но оставляет di git 6. Который недопустим для hex и вызывает искажение, если вы попытаетесь разобрать файл.

Я могу придумать запутанные обходные пути, но я стараюсь избегать. По сути, мне просто нужно удалить «\ r» или «0d» из строки.

Также PS: Если я пишу текстовые файлы с шестнадцатеричными данными, было бы разумнее сохранить их в двоичном формате?

1 Ответ

3 голосов
/ 30 января 2020

Вместо использования trimright, попробуйте:

regsub {0d$} $foodType {} foodType

Это удалит завершающий «0d» вместо удаления всех «0» и всех «d» символов.

Ссылки : regsub , re_syntax , string

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...