由于对数据性质的不确定性,我们开始将一些 bcd 值读取到 Chars。例如,如果文件中的数据是 6 个字节长,那么我们将这样读取它:
var
fifi : TextFile;
path, res: AnsiString;
i : Integer;
tmp : AnsiChar;
begin
assignFile(fifi, path);
reset(fifi);
for i := 1 to 6 do
begin
read(fifi, tmp);
res := res + tmp;
end;
end.
因为它是对每个字符进行强制转换的二进制数据,所以我们返回了数据。
这是现在很难改变的事情。
我现在有一个自定义函数,它从字节数组形式的字符串构造带符号的打包 bcd 值。
然后我想做相反的事情,将这个数组的每个字节填充到 AnsiChar 中,以便我们可以将它与过程中早期生成的 ebcdic 数据合并。
但是 read 函数自然地做的事情,很难重现。从我陈述的内容中总是会发生一些损坏或隐式转换。
这是我尝试过的:
function memoryStreamToString(str: TMemoryStream): AnsiString;
begin
setString(result, PChar(str.memory), str.size div sizeOf(AnsiChar));
end;
function byteToStr(t: array of Byte): AnsiString;
const
digits: array[0..15] of AnsiChar =
('0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'a', 'b', 'c', 'd', 'e', 'f');
var
i: Integer;
begin
result := '';
for i := low(t) to high(t) do
result := result + digits[(t[i] shr 4) and $0F] + digits[t[i] and $0F];
end;
var
buff : array of Byte;
bcdlen : Integer;
res : AnsiString;
//str : TMemoryStream;
begin
//code that init res, buff
// way number one
//str := TMemoryStream.Create;
//str.writeBuffer(buff[0], bcdLen);
//res := memoryStreamToString(str);
//str.free;
//way number two
//res := byteToStr(buff);
// way number three
//setLength(res, bcdLen);
//move(buff[0], res[1], bcdLen);
end.
所以我认为的问题是你如何在 AnsiChar 中填充一个字节而不会损坏?我认为这样做不是很好的做法,因为数据的性质没有得到尊重,但是我们在实施阶段已经太晚了,无法改变它。
谢谢你。