2013-12-19 14 views
4

나는 안드로이드 블루투스 인쇄 작업 중이다. 프린터는 표준 POS 열전 사 프린터입니다. 자바 바이트 배열에서 델파이 바이트 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를로드 할 이것은 자바 코드입니다 :

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;

델파이 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 식 값이다 : X 용

enter image description here

+0

자바 바이트 서명 델파이 바이트를하지 않습니다. 그러나 그것에 대해 걱정할 필요가 없습니다. 여전히 8 비트 만 전송됩니다. 그게 무슨 문제 야? –

답변

4

= 0 렌으로는

len-1을 사용해야합니다. 그렇지 않으면 배열과 문자열의 경계를 벗어납니다.

문자열을 바이트 배열로 복사 할 때 유니 코드를 고려하지 않으므로 string에 UTF-16 대리 문자를 사용해야하는 비 ASCII 문자가 포함되어 있으면 문제가 발생할 가능성이 있습니다. 먼저 델파이 바이트 배열에 string을 변환 할 SysUtils.TEncoding 클래스를 사용하고 예를 들어, 자바 바이트 배열에 있음을 복사해야합니다 :

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

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;  

또는 루프 제거

어떻게이 라인을 변환 할 수 있습니까?

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