-1

由于对数据性质的不确定性,我们开始将一些 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 中填充一个字节而不会损坏?我认为这样做不是很好的做法,因为数据的性质没有得到尊重,但是我们在实施阶段已经太晚了,无法改变它。

谢谢你。

4

1 回答 1

2

除非您执行字符串转换操作,否则不会有任何损坏。把一个字节变成AnsiString这样:

str[i] := Chr(b); // I am assuming you are on a pre-Unicode Delphi

或者您可以使用演员表:

str[i] := AnsiChar(b);

这会将单个字节放入预分配的元素中AnsiString。在相反的方向你写:

b := ord(str[i]);

如果要将字节数组 blit 到字符串上,请使用:

SetLength(str, count);
Move(buff, Pointer(str)^, count);

此代码与您的第三种方法相同。它工作得很好并且不会损坏,除非您对字符串执行一些后续操作。您的第一种方法也可以,但过于复杂。你的第二种方法做了一些完全不同的事情,涉及十六进制表示。我不太确定你想在那里实现什么。

但是你真的想使用字节数组而不是字符串。一个动态的字节数组,array of Byte是你的家伙。

于 2013-06-12T12:47:36.460 回答