获取十六进制子字符串并转换为二进制 Delphi XE2

Get a hex substring & convert to binary Delphi XE2

我的程序通过串行端口和 returns 这个字符串从设备读取。 'IC'#$0088#$0080'Ô'#$0080#$0080 我需要获取 5 个十六进制值并转换为二进制。 #$0088 = 10001000,#$0080 = 10000000,Ô = 11010100。

我可以转换 80 和 88,但很难从整个字符串中提取它们。 Ô(xD4) I 既不能提取也不能转换。像 Ô 这样的扩展字符可以位于任何或所有位置。

我的串口组件中的读取方法是:

function Read(var Buffer; Count: Integer): Integer;
function ReadStr(var Str: string; Count: Integer): Integer;
function ReadAsync(var Buffer; Count: Integer;   var AsyncPtr: PAsync): Integer;
function ReadStrAsync(var Str: Ansistring; Count: Integer;  var AsyncPtr: PAsync): Integer;

你能给我一个读取二进制的例子吗?

看起来真正的问题是您将二进制数据视为 UTF-16 编码文本。

无论向您提供此数据的是什么,都不会向您提供 UTF-16 编码的文本。该设备真正为您提供的是一个字节数组。将其视为文本而不是文本。然后你可以通过索引挑选出你感兴趣的五个值。

因此,声明一个字节数组:

var
  Data: TArray<Byte>; // dynamic array

var
  Data: TBytes; // shorthand for the same

var
  Data: array [0..N-1] of Byte; // fixed length array

然后读入那些数组。要挑选值,请使用 Data[i]

请注意,根据问题和您的评论,我在这里使用了大量的猜测。不要相信我的话。我的猜测可能是错误的。请查阅设备的通信协议规范。并仔细学习文本和二进制之间的区别。

正如我之前在评论中所写,您问题中消息的问题在于它部分由非 ASCII 字符组成。 ASCII 范围从 $00 到 $7F 并且具有与 Unicode U+0000 到 U+007F 相同的字符。因此没有转换(前导 0 除外)。另一方面,AnsiCharacters($80 到 $FF)根据使用的代码页进行转换,以便为两者保持相同的字形。 F.Ex。 AnsiChar $80(CP1252 中的欧元符号)因此被转换为 Unicode U+02C6。低字节的位模式不再匹配。

参考:https://msdn.microsoft.com/en-us/library/cc195054.aspx

以下代码显示了两个测试的结果,使用 Char 与 AnsiChar

procedure TMainForm.Button2Click(Sender: TObject);
const
  Buffer: array[0..7] of AnsiChar = ('I','C', #, #, #$D4, #, #, ';');
//  Buffer: array[0..7] of Char = ('I','C', #, #, #$D4, #, #, ';');
  BinChars: array[0..1] of Char = ('0','1');
var
  i, k: integer;
  c: AnsiChar;
//  c: Char;
  s: string;
begin
  for k := 2 to 6 do
  begin
    c := Buffer[k];
    SetLength(s, 8);
    for i := 0 to 7 do
      s[8-i] := BinChars[(ord(c) shr i) and 1];
    Memo1.Lines.Add(format('Character %d in binary format: %s',[k, s]));
  end;
end;

使用字符 (UTF-16 WideChar)

AnsiChar # is converted to U+02C6 
AnsiChar # is converted to U+20AC 
AnsiChar #$D4 is converted to U+00D4 !

低字节给出

Character 2 in binary format: 11000110 
Character 3 in binary format: 10101100 
Character 4 in binary format: 11010100
Character 5 in binary format: 10101100 
Character 6 in binary format: 10101100

使用 AnsiChar

Character 2 in binary format: 10001000
Character 3 in binary format: 10000000
Character 4 in binary format: 11010100
Character 5 in binary format: 10000000
Character 6 in binary format: 10000000

不幸的是,从 Unicode 到 Ansi 的转换(即使最初是从 Ansi 到 Unicode 的转换)是有损的并且会失败。

根据现有信息,我真的没有看到任何简单的解决方案。