2013-12-19 1 views
4

Я работаю над Bluetooth Bluetooth. Принтер является стандартным POS-термопринтером.Байт байта Java в Delphi byte arry

Это мой способ передачи данных на принтер (ЭТА ЧАСТЬ РАБОТАЕТ):

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)); 

Теперь я хочу, чтобы загрузить другой обугленный 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); 

Как могу ли я преобразовать эти строки?

  • 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); 

Это ценности, JAVA Выражения из Exlipse:

enter image description here

+0

Java байт подписанную и Delphi байт не являются. Однако вам не о чем беспокоиться. Это еще 8 бит, отправляемых по проводу. В чем проблема? –

ответ

4

для X: = 0 для Len сделать

Это должно использоваться len-1, иначе вы выйдете за пределы как массива, так и строки.

Вы также не учитываете Unicode при копировании строки в массив байтов, поэтому у вас могут возникнуть проблемы, если string содержит любые символы, отличные от ASCII, которые требуют использования суррогатов UTF-16. Вы должны использовать 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); 
+0

http://stackoverflow.com/questions/24928867/how-i-can-printing-a-string-on-a-pos-printer-by-delphi-android-with-jni Можете ли вы мне помочь :) – Tarasov