Кажется, я не могу найти разумного обходного пути или исправить удаление "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: Если я пишу текстовые файлы с шестнадцатеричными данными, было бы разумнее сохранить их в двоичном формате?