我正在开发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));
现在我想加载不同的char encoing,这是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);
如何转换这些行?
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);
这是Exlipse的JAVA表达式值:
答案 0 :(得分: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;
如何转换这些行?
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);