为什么在RAD Studio 10.1中使用以下代码会得到错误的输出?
var
sPalette : string;
mystream: TfileStream;
begin
mystream := TfileStream.Create('C:\Data\test.bmp', fmCreate);
sPalette := #1#2#3#4#5#6;
mystream.WriteBuffer(Pointer(sPalette)^, Length(sPalette));
mystream.Free;
end;
已获得输出:01 02 03 04 05 06
预期输出:01 02 03 04 05 06
个
1条答案
按热度按时间qyswt5oh1#
在 Delphi 2009+中,
string
是一个16位,UTF-16编码的UnicodeString
。您没有考虑到SizeOf(Char)
是2个字节,而不是您所期望的1个字节。Length(string)
是以字符数表示的,而不是以字节数表示的。您的字符串长度为6个字符,但大小为12个字节。您只将string
的前6个字节写入文件。由于您的string
包含#128
以下的ASCII字符,因此每隔一个字节将写入$00
。请改用8位
AnsiString
,例如:或者,使用
TEncoding
将Unicode字符串转换为8位字节编码:或者:
不过,对于二进制数据,首先不应该使用
string
,而应该使用字节数组,例如:或者更好的方法是使用
TBitmap
对象,因为您正在写入.bmp
文件,例如: