hexidecmial 中以 "m" 结尾的单词最终会因删除回车符 return 而损坏

Words ending in "m" in hexidecmial end up being corrupted by removal of carriage return

我似乎无法找到合理的解决方法,或解决从字符串中删除“0d”“\r”而不破坏十六进制字符串的问题。

好的,我正在从 HTML 表单向变量提供数据。 HTML 页面有三个独立的唯一 HTML 文本区域字段,它们的填充方式如下。

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

提交后,将以十六进制写入文本文件。

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

在本地,由于 HTML textarea 的新行特性,当您 post textarea 的表单添加回车 returns "CR" 或“0d” (十六进制)到行尾。按照设计。

例如,当从原始输入中收集字符串 "Ice Cream" 并将其转换为十六进制时: Ice Cream 变为 49636520437265616d0d Pudding 变成 50756464696e670d 等等。

所以我删除了这个 (0d),但是接下来是写入文件。我有一个循环,通过换行“\n”

从 HTML 页面拆分每个输入的值
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”,因为表示 \r(回车符 return)的“0d”被语法

[string trimright $someValue 0d]

它还会从字符串中去除十六进制小数 "d",在本例中为十六进制字符串 "Ice Cream"。我不知道为什么。我尝试了很多其他方法,但 none 行得通。

所以 Ice Cream (43 72 65 61 6d) 变成 Ice Crea (43 72 65 61 6) 但留下数字 6 . 这对十六进制无效,如果您尝试解析文件,则会引发损坏。

我可以想出复杂的解决方法,但我正在努力避免。 本质上,我只需要从字符串中删除“\r”或“0d”。

另外P.S:如果我正在用十六进制数据编写文本文件,将它们保存为二进制格式会更明智吗?

与其使用 trimright,不如尝试:

regsub {0d$} $foodType {} foodType

这将删除尾随的“0d”而不是剥离 所有“0”和所有 'd' 个字符。

参考文献:regsub, re_syntax, string