2017-04-25 143 views
1

將包含十六進制字符0x00的字符串複製到剪貼板並將其粘貼到外部應用程序(十六進制編輯器,記事本++等)中時遇到問題。它在0x00字節處終止字符串。將包含十六進制0x00的字符串複製到剪貼板

複製包含0x01的字符串時0x02 0x03 0x00 0x01 0x01 0x02 它只將0x01 0x02 0x03粘貼到外部應用程序中。

內部(在同一個Java程序至少),這很好,我也得到了整個字符串返回,如:

copying string 
Str length = 7 
Str hex = 01 02 03 00 01 02 03 
----- 
Pasting string 
Str length = 7 
Str hex = 01 02 03 00 01 02 03 

但運行此,粘貼剪貼板到外部應用程序後,只會複製字符最大爲0x00。有沒有人有任何想法如何解決這個問題?

來源:

import java.awt.Toolkit; 
import java.awt.datatransfer.Clipboard; 
import java.awt.datatransfer.DataFlavor; 
import java.awt.datatransfer.StringSelection; 

public class Test 
{ 
public static void main(String[] args) 
{ 
    String strToCopy = new String(new byte[] {0x01, 0x02, 0x03, 0x00, 0x01, 0x02, 0x03}); 

    System.out.println("copying string"); 
    printStringDetails(strToCopy); 
    copyStringToClipboard(strToCopy); 

    System.out.println("-----"); 

    System.out.println("Pasting string"); 
    String pastedString = getStringFromClipboard(); 
    printStringDetails(pastedString); 
} 

public static void printStringDetails(String string) 
{ 

    System.out.println(String.format("Str length = %d", string.length())); 
    System.out.println(String.format("Str hex = %s", bytesToHex(string.getBytes()))); 
} 

public static void copyStringToClipboard(String strToCopy) 
{ 
    StringSelection stringSelection = new StringSelection(strToCopy); 
    Clipboard clipboard = Toolkit.getDefaultToolkit().getSystemClipboard(); 
    clipboard.setContents(stringSelection, null); 
} 

public static String getStringFromClipboard() 
{ 
    String returnedString = ""; 
    Clipboard clipboard = Toolkit.getDefaultToolkit().getSystemClipboard(); 
    try 
    { 
     returnedString = (String)clipboard.getData(DataFlavor.stringFlavor); 
    } 
    catch(Exception e) 
    { 
     e.printStackTrace(); 
    } 

    return returnedString; 
} 

/* 
* Converts bytes array to hex string 
*/ 
public static String bytesToHex(byte[] byteArray) 
{ 
    StringBuilder sb = new StringBuilder(); 
    for(byte b : byteArray) 
    { 
     sb.append(String.format("%02X", b)); 
     sb.append(" "); 
    } 
    return sb.toString(); 
} 
} 

回答

0

在我的筆記本電腦(OS X),一切都還好,如果我粘貼字符串VIM。

enter image description here

這裏是十六進制信息:

enter image description here

我認爲這個問題取決於外部應用程序的執行。如果它可以處理0x00,它將接收整個字符串。

+0

我會在其他平臺上試用它。 我已經「手動」將字符串從C++程序複製到Notepad ++並且它可以工作,而不是從Java到Notepad ++,所以我認爲這是一個Java問題,但可能是錯誤的 – Wassa

相關問題