Java字节数组转换为Delphi字节数组。

4

我正在开发 Android 蓝牙打印功能,所用打印机为标准 POS 热敏打印机。

以下是我向打印机发送数据的方法(此部分已经工作正常):

var
    Adapter: JBluetoothAdapter; 
    remoteDevice: JBluetoothDevice;
    Sock: JBluetoothSocket;
    ostream: JOutputStream;
begin
    Adapter := TJBluetoothAdapter.JavaClass.getDefaultAdapter;
    remoteDevice := Adapter.getRemoteDevice(stringtojstring(targetMAC));
    Sock := remoteDevice.createRfcommSocketToServiceRecord(uid);
    ostream := Sock.getOutputStream;

    ....    
    function StringToJA(Data: String): TJavaArray<Byte>;
    var
      X: integer;
      len: integer;
    begin
      len := Length(Data);
      Result := TJavaArray<Byte>.Create(len);
      for X := 0 to len do
      begin
        Result.Items[X] := Ord(Data[X]);
      end;
    end;    
    // THIS LINE PRINT TEXT
    ostream.write(StringToJA(txt));

现在我想加载不同的字符编码,以下是JAVA代码:
现在我希望加载不同的字符编码,下面是JAVA代码:
 int a=23;
 String codeL="iso8859-2";
 String txt="SOME TEXT...ščž";
 byte data[] = txt.getBytes(codeL);
 byte sendText[]=new byte[3];
 sendText[0]=0x1B;
 sendText[1]=0x74;
 sendText[2]=(byte)a;
 mobileprint.PRTSendBuffer(sendText, sendText.length);   

我该如何转换这些代码行?

  • txt.getBytes(codeL);
  • sendText[2]=(byte)a;

Delphi XE5 代码:

 ...
  A : Integer;
  txt, codeL: string;
  data : TJavaArray<Byte>;
  sendText : TJavaArray<Byte>;
begin
  A := 23;
  codeL := 'iso8859-2';
  txt := 'SOME TEXT...ščž';
  data := ??? txt.getBytes(codeL); ???
  sendText := TJavaArray<Byte>.Create(3);
  sendText.Items[0] := $1B;
  sendText.Items[1] := $74;
  sendText.Items[2] := ???Byte(A)???;

  ostream.write(sendText);
  ostream.write(data);

这是来自Eclipse的JAVA表达式值:
这里展示了Eclipse调试器中Java表达式的值。

Java字节是有符号的,而Delphi字节则不是。然而,你不必担心这个问题。在传输过程中仍然只是发送了8位。问题出在哪里呢? - Marcus Adams
1个回答

4

对于X从0到len的循环,应该使用len-1,否则将超出数组和字符串的范围。

还要考虑Unicode问题,所以如果string包含任何需要使用UTF-16代理对的非ASCII字符,则可能会遇到问题。您应该先使用SysUtils.TEncoding类将string转换为Delphi字节数组,然后将其复制到Java字节数组中,例如:

function StringToJA(Data: String): TJavaArray<Byte>;
var
  Arr: TBytes;
  len, X: integer;
begin
  Arr := TEncoding.Default.GetBytes(Data); // or any other TEncoding you need
  len := Length(Arr);
  Result := TJavaArray<Byte>.Create(len);
  for X := 0 to len-1 do
    Result.Items[X] := Arr[X];
end;    

另外一种方法是去掉循环:

function StringToJA(Data: String): TJavaArray<Byte>;
var
  Arr: TBytes;
  len: integer;
begin
  Arr := TEncoding.Default.GetBytes(Data);
  len := Length(Arr);
  Result := TJavaArray<Byte>.Create(len);
  if len > 0 then Move(Arr[0], Result.Data^, len);
end;

How can I convert these lines?

txt.getBytes(codeL);
sendText[2]=(byte)a;

通过使用TEncoding类,例如:

function StringToJA(Data: string; charset: String = ''): TJavaArray<Byte>;
var
  Encoding: TEncoding;
  Arr: TBytes;
  len: integer;
begin
  if charset <> '' then 
    Encoding := TEncoding.GetEncoding(charset)
 else
    Encoding := TEncoding.Default;
  Arr := Encoding.GetBytes(Data);
  len := Length(Arr);
  Result := TJavaArray<Byte>.Create(len);
  if len > 0 then Move(Arr[0], Result.Data^, len);
end;

var
  txt: string;
  data : TJavaArray<Byte>;
  sendText : TJavaArray<Byte>;
begin
  txt := 'SOME TEXT...ščž';
  data := StringToJA(txt, 'iso8859-2');

  sendText := TJavaArray<Byte>.Create(3);
  sendText.Items[0] := $1B;
  sendText.Items[1] := $74;
  sendText.Items[2] := Byte(23);

  ostream.write(sendText);
  ostream.write(data);

你能帮我吗 :) 这是一个关于使用Delphi Android和JNI打印字符串到POS打印机的问题。 - Tarasov

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接