将十六进制字符串作为字节写入套接字java

将十六进制字符串作为字节写入套接字java,java,sockets,Java,Sockets,我有一个十六进制值字符串,我正试图将其作为字节写入套接字 String confDeliv = "\\x7E\\x01\\x00\\x20\\x37\\x02\\x03\\xF2\\xD5"; 我试着这样做是为了解决我的问题 byte [] Delivery_Conf = {(byte)0x7E, (byte)0x01, (byte)0x00, (byte)0x20, (byte)0x37, (byte)0x02, (byte)0x03

我有一个十六进制值字符串,我正试图将其作为字节写入套接字

String confDeliv = "\\x7E\\x01\\x00\\x20\\x37\\x02\\x03\\xF2\\xD5";
我试着这样做是为了解决我的问题

byte [] Delivery_Conf = {(byte)0x7E, (byte)0x01, (byte)0x00, (byte)0x20,
                             (byte)0x37, (byte)0x02, (byte)0x03, (byte)0xF2, (byte)0xD5};
但我还没有成功地将其写入套接字。我没有收到任何错误,但当我将它发送到设备时,它没有执行我需要它执行的操作,我尝试了两种不同的方法

尝试1:

DataOutputStream dOut = new DataOutputStream(sock.getOutputStream());                                           //69.171.154.64

    for (int i = 0; i < Delivery_Conf.length-1; i++) {
        dOut.writeByte(Delivery_Conf[i]);
    }
dOut.flush();
这是我尝试将其作为字符串发送时使用的方法,但仍然没有成功。当我使用python的字节字符串时,我能够使设备工作

例如


我认为当我发送java时,它会改变一些东西,这就是为什么我可以让它与java一起工作。我环顾四周已有一段时间了,但似乎没有找到任何有助于我解决问题的方法。

您应该使用以下方法:

byte [] Delivery_Conf = {(byte)0x7E, (byte)0x01, (byte)0x00, (byte)0x20,
                         (byte)0x37, (byte)0x02, (byte)0x03, (byte)0xF2, (byte)0xD5};
// ...
dos.write(Delivery_conf);
一次写入一个字节的版本应该可以工作,但效率很低,而且设备可能有时间限制


使用
字符串的版本不正确。添加另一个反斜杠以使
\x
编译不是一个正确的解决方案:您应该在整个过程中将
\x
更改为
\u00
。当然,在整个字符串中都是这样。

您能准确地解释一下设备端接收到的字符串的“错误”是什么吗?这正是我想要找出的@Uniknow当我发送需要“\x7E”的字节时,我必须使用反斜杠,否则它不起作用。我如何将其添加到代码中?为了让这一切顺利进行?您是否尝试过使用apache commans的
Hex
对字符串进行编码/解码,并查看结果如何?PS:你希望在设备端有一个字符串或字节数组吗?@uniknow任何东西,只要我通过完整的命令,你的意思是“将\x改为\u00贯穿”。我不能对我的字节数组这样做,因为它将其误认为字符串。我说的是“使用
字符串的版本”
”。请看我写的,我的错。谢谢你的回复。我怎样才能写得更有效@EJP@BSD_你不能。这里没有效率低下的问题。在实际程序中,像这样的固定数据当然是
静态final
confDel = b"\x7E\x01\x00\x20\x37\x02\x03\xF2\xD5"
byte [] Delivery_Conf = {(byte)0x7E, (byte)0x01, (byte)0x00, (byte)0x20,
                         (byte)0x37, (byte)0x02, (byte)0x03, (byte)0xF2, (byte)0xD5};
// ...
dos.write(Delivery_conf);