我想做以下事情,但我得到了#34;访问违规"错误。
type Bin = array of byte;
var s:string;
begin
s:='some string';
Bin(s)[3]:=ord('X');
caption:=s;
end;
为什么这不起作用?
答案 0 :(得分:6)
这不起作用,因为AnsiString
和动态字节数组是不兼容的类型。您的演员表无效,任何事情都可能发生。
事实证明,你的字符串是文字。编译器通过将字符串放在只读内存中来处理它。因此,当你背后的访问违规时。
解决方案很简单。直接在字符串上使用[]
索引运算符:
s[i] := ...;
执行此操作时,编译器知道该字符串是只读的,并将其复制到可写内存以允许您对其进行修改。
您说您不想使用ord()
和chr()
。我不知道为什么。它们是正确使用的东西,并不像它们甚至会导致发出任何代码。它们是内在的,变成了无操作。
您在评论中说明您正在编码加密算法。然后,这指出了你的方法的根本缺陷。加密算法在字节数组上运行。不要将文本输入加密代码。使用一些明确定义的文本编码转换为字节数组。然后对字节数组进行操作。并且不要重新发明轮子。使用现有的加密库。