Java 正在将包含十六进制0x00的字符串复制到剪贴板
我在将包含十六进制字符0x00的字符串复制到剪贴板,并将其粘贴到外部应用程序(十六进制编辑器、记事本++等)时遇到问题。它在0x00字节处终止字符串 复制包含0x01 0x02 0x03 0x00 0x01 0x01 0x02的字符串时 它仅将0x01 0x02 0x03粘贴到外部应用程序中 在内部(至少在同一个java程序中),这很好,我得到了整个字符串,例如:Java 正在将包含十六进制0x00的字符串复制到剪贴板,java,string,byte,clipboard,Java,String,Byte,Clipboard,我在将包含十六进制字符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 ----
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();
}
}
在我的笔记本电脑(OSX)中,如果我将字符串粘贴到VIM,一切都会正常进行
以下是十六进制信息:
我认为问题取决于外部应用程序的实现。如果它可以处理0x00,它将接收整个字符串。ASCII
0x00
表示NUL
来自超级用户处理此“字符”的以下问题:
:
不可以,不能将嵌入空字符的文本放在
剪贴板
及
空字符表示数据结束
我会在其他平台上尝试。我已经“手动”将字符串从C++程序复制到记事本+ +,它工作,不是从java到记事本++,所以我认为这是java问题,但可能是错误的。