【发布时间】:2017-09-09 05:17:17
【问题描述】:
我一直在尝试使用以下方法将很长的十六进制字符串(价值 8mb 或 1600 万个字符)写入文件:
File.WriteAllBytes(path, hexarray);
如果我尝试编译我会得到一个错误:
逻辑内存不足
将此十六进制写入文件而不引发错误的最佳方法是什么?
我正在考虑将字符串分成多个字符串,然后在 EOF 处添加 hex1 然后 hex2 但在尝试之前我意识到我仍然会在内存中添加很多字符串。
编辑我应该多指定我的代码
string z = "2412341A4D2341341234141"; <--this is alot longer tho
File.WriteAllBytes("C:/user/asdf/setup.sdf"), StringToByteArray(z));
public static byte[] StringToByteArray(string hex)
{
return Enumerable.Range(0, hex.Length)
.Where(x => x % 2 == 0)
.Select(x => Convert.ToByte(hex.Substring(x, 2), 16))
.ToArray();
}
【问题讨论】:
-
你从哪里得到字符串?它是在内存中还是生成的还是您正在复制文件?
-
十六进制来自我复制十六进制并将其制成字符串的文件
-
您是在尝试写入字节还是字符?永远不要使用二进制数据中的字符串。一个 c# 字符是两个字节,具有一个私有属性,指示该字符是一个字节还是两个字节。所以 8 mb 字符介于 8 mb 和 16 mb 字节之间。所以你必须使用 Encoding.XXX.GetBytes() 将字符串转换为字节数组。如果您有二进制数据,请不要使用编码转换为字符串。使用 BinaryWriter() 插入二进制数据。
-
@jdweng:在很多情况下,您需要以文本形式表示二进制数据,通常是十六进制或 base64。在这两种情况下,您都不会使用
Encoding.GetBytes,也不需要BinaryWriter。目前尚不清楚 OP 的数据实际来自何处——我们不知道此处是否需要十六进制部分——但肯定有一些情况。 -
@Ragekillen:在应用程序中包含文件内容的更好方法是使其成为嵌入式资源文件。