【问题标题】:Socket pass value as Hex套接字传递值为十六进制
【发布时间】:2011-04-05 03:25:04
【问题描述】:

我正在尝试将套接字中的字符串值传递给另一台服务器。另一台服务器应该收到十六进制格式的值。

即如果我的字符串在服务器上是 s = "600185838e",它应该接收为 60 01 85 83 8e,但我发送的这些值已转换为 ASCII 并且不是所需的格式。

我正在使用套接字连接

BufferedWriter wr = new BufferedWriter(new OutputStreamWriter(this.socket.getOutputStream()));

wr.write(messageBody);

wr.flush(); 

如何发送类似于十六进制值的字符串值?

提前谢谢大家

【问题讨论】:

  • Err, hex ASCII 格式。你是说二进制吗?

标签: java sockets


【解决方案1】:

你应该convert the hex string to byte array然后将它作为字节数组发送:

OutputStream out = this.socket.getOutputStream();
out.write(yourBytearray);

这是将十六进制字符串转换为字节[]的方法,这是我提供的链接的副本,但我在这里复制它以明确我在说什么:

public static byte[] hexStringToByteArray(String s) {
    int len = s.length();
    byte[] data = new byte[len / 2];
    for (int i = 0; i < len; i += 2) {
        data[i / 2] = (byte) ((Character.digit(s.charAt(i), 16) << 4)
                             + Character.digit(s.charAt(i+1), 16));
    }
    return data;
}

【讨论】:

  • 您好,我也试过了,String s="600185838e" 转换为 hexString 的值为 = "36303031383538333865"。 & 将此 hexString 作为 messageBody 发送......但在套接字服务器上,这给出了 ASCII 值。
  • @Vardhaman - 不要将其转换为十六进制字符串,将其转换为字节数组,如我发布的链接中所述。
  • 嗨,MbyD,我也试过了,但在服务器上,他们将 600185838e 接收为 6-->36 0-->30 0-->30 ...... e-->65 (即再次以 ASCII 格式) ,服务器应将其读取为 60 01 85 .... 8e
  • 您是否检查了正在发送的字节数组是什么(在实际发送之前先查看一下)?
  • 我刚试过我在循环中打印了字节数组,它像这样的格式 54 48 48 49 56 53 56 51 56 101 0035_0032
【解决方案2】:

您也可以尝试将字符串拆分为 2 个字符的长字符串,并通过 Byte.parseByte(my2CharString , 16) 将它们转换为单个字节,然后发送它们

这里有一些代码可以满足你的要求,只需将 System.out.println() 替换为 write()

String output = "ffee101";
    while(output.length() > 0){
        String byteToWrite;
        if(output.length() <= 2){
            byteToWrite = output;
            output = "";
        }
        else{
            byteToWrite = output.substring(0,2);
            output = output.substring(2);
        }
        byte b = (byte)Short.parseShort(byteToWrite, 16);
        System.out.println(b);
    }

【讨论】:

  • 嗨,邓肯,搞糊涂了...您的意思是说 6001 ... 将其拆分为 60 01... 并在循环中运行相同的...但是发送数据将在循环条件下运行?你能帮我提供一个代码sn-p吗?我只对 String s="8e" 尝试了相同的操作,得到 Error java.lang.NumberFormatException: Value out of range。值:"8e" 基数:16
  • 哎呀,对不起。我忘记了 parseByte 处理带符号的数字(java 很傻)。尝试类型转换: (byte)Short.parseShort(my2CharString , 16)
  • 另外,您可能应该使用 OutputStream 这样您就可以写入字节,而不是整数或字符串
  • 嗨,邓肯,按照您的建议尝试了,即尝试了“8e”。 System.out.println("byte:-"+(byte)Short.parseShort("8e",16));输出为 -114
  • -114 是正确的。就像我说的,java 把所有事情都当作有符号的数字。因此,任何超过 0x80 的值都是负数(从 -128 开始,到 -1 为 0xFF)
猜你喜欢
  • 1970-01-01
  • 2013-02-19
  • 2017-03-26
  • 1970-01-01
  • 2018-01-22
  • 2012-06-03
  • 2012-06-11
  • 2013-02-24
  • 1970-01-01
相关资源
最近更新 更多