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:如果我正在用十六进制数据编写文本文件,将它们保存为二进制格式会更明智吗?
我似乎无法找到合理的解决方法,或解决从字符串中删除“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:如果我正在用十六进制数据编写文本文件,将它们保存为二进制格式会更明智吗?