这是我将字符串转换为十六进制的代码
Function StringToHex(ByVal text As String) As String
Dim xhex As String
For i As Integer = 0 To text.Length - 1
xhex &= Asc(text.Substring(i, 1)).ToString("x").ToUpper
Next
Return xhex
End Function
我使用此代码将字符串文件转换为十六进制,但如果大小超过1MB的文件我的程序没有响应 如何使这个代码更有效的大小文件超过1MB抱歉我的英语不好
答案 0 :(得分:1)
正如我在最初的评论中所说,当前的方法是在每次进行For循环时创建一个新字符串。字符串在.NET中是不可变的(无法更改) - 例如,如果字符串中有3000个字符,xHex = &a
将创建3,000个字符串,而这仅仅是第一个字符串部分。然后你有Substring
,然后是ToString
,最后是ToUpper
- 所以如果我的数学是正确的,你就会为输入字符串中的每个字符创建4个字符串(所以如果你有3,000个字符,那12,000个附加字符串)。
不需要调用Substring
- 您可以将字符串视为数组并将字符串中的每个字符作为数组索引访问,所以现在您可以:
xhex &= Asc(text(i)).ToString("x").ToUpper
您还可以使用大写" X"来消除呼叫.ToUpper()
。在致电.ToString()
时 - 所以现在你有:
xhex &= Asc(text(i)).ToString("X")
您还可以将xhex
设为StringBuilder
,然后每次通过循环(对.ToString()
的调用)只创建一个附加字符串。把它们放在一起就可以了:
Dim xhex As StringBuilder = New StringBuilder()
For i As Integer = 0 To text.Length - 1
xhex.Append(Asc(text(i).ToString("X"))
Next
Return xhex.ToString()
这可能有助于此过程,但如果字符串非常大,您可能仍会遇到内存问题。如果文件非常大,我建议您使用Stream
读取它并一次处理Stream
一个字节(或者您选择的几个字节)。
我还建议使用Googling for VB.NET将字符串转换为十六进制,因为有许多其他方法可以做到这一点。