【问题标题】:How to implement an unsigned byte in java, restriction being the size should be 1 byte only如何在java中实现一个无符号字节,限制是大小应该只有1个字节
【发布时间】:2013-03-30 02:41:21
【问题描述】:

如何在 java 中实现一个无符号字节,限制是大小只能是 1 个字节,即我们不能通过 And'ing 与 0xFF 转换为 short 或 int

我必须通过套接字传输一个无符号字节数组,因为接收端是一个 C 代码方法,只需要一个大小为 1 字节的无符号字节数组,但是由于 Java 不支持无符号字节的概念,所以会出现问题。我们有什么办法可以做到这一点。

字节 b=(字节)0xF0;甚至字节 b1=0x00;未通过套接字通道正确发送。请参阅写入服务器的方法。

public void encode(IoSession session, Object message, ProtocolEncoderOutput out) 抛出异常 {

    //lProxylogger.info("Inside ProtocolEncoderAdapter. Encoding response to client..");
    String response ;

    //lProxylogger.info("The response length in encode adapter is "+ response.length()+" Message="+response);
    byte[] responseStream; 

    response=(String) message;

    responseStream= response.getBytes("windows-1252");

    //responseStream=serialize(message);

     IoBuffer buffer = IoBuffer.allocate(responseStream.length);
    // buffer.putInt(response.length);
     //IoBuffer buffer=(IoBuffer)message;
      // buffer.putObject(message);
     System.out.println("Encoded Response:"+new String(responseStream));
     for(byte b:responseStream)
         System.out.print(b+",");
     System.out.println();
     buffer.put(responseStream);
//     lProxylogger.info("the response buffer size is "+ buffer.capacity());
     buffer.setAutoShrink(true);
    buffer.shrink();
  //  lProxylogger.info("After shrinking the buffer size is "+ buffer.capacity());
     buffer.flip();

    //System.out.println("Writing response to Stream..");
    out.write(buffer);

}

【问题讨论】:

  • 我认为问题在于如何在 C 端打印出二进制文件,请参阅我的回答。

标签: java sockets io unsigned mina


【解决方案1】:

有符号只是你如何解释一个字节的 8 位。签名既不长也不短,传输也没有什么不同。您只需发送字节。如果它是无符号的,则由任何解释该字节的东西来将其视为无符号的,但这与将其表示为 8 位或发送它无关。

【讨论】:

  • 感谢 Sean 的回复,当我尝试通过套接字发送 0xF0(-16 ASCII 转换)甚至 0x00 时,该值尚未通过套接字端正确解码(一些垃圾)。我用的是Java代码,接收端是用C实现的,我用的是Redhat Linux平台。
  • 正如您所说,这是 C 代码中“解码”(解释为已签名)的问题。它与 Java 中的发送/编码端无关。
  • 没错,但我的目标是通过套接字将一些值(如 0xF0,0x00)发送到 C 编码服务器,该服务器需要无符号字节。我可以正确地接收和解码来自服务器的所有值,但是当我尝试发送这些值时,它会报告一些垃圾而不是接收端的预期。这是我将数据发送到服务器的实现(out.write 方法最终写入服务器)
  • 不确定你的意思。位为 11110000 的字节既无符号也无符号。您可以在 Java 中将其写为 (byte) 0xF0。也许你实际上并没有发送那个。您的代码没有显示这一点。
  • 抱歉不清楚,让我们假设一个场景,byte [] b={48,0x00,(byte)0xF0},我想通过套接字传输 b,在接收端只有 48已正确收到但没有 0x00 或 0xF0
【解决方案2】:

看来您选择的字符编码可能会损坏您的字符串。如果您也使用这样的编码,则不应尝试将二进制文件放入文本中。

我建议您简化代码。而是尝试

String response=(String) message;
for(char ch : response.toCharArray()) {
    System.out.println(Integer.toHexString(ch) + ", ");
    out.write(ch);
}

如果这可行,我建议尝试使用基本上相同的 ISO-8859-1 编码。

【讨论】:

  • 同样更改为 char 数组会将大小提升为 2 字节,而服务器期望 1 字节用于导致溢出的内容。我尝试了不同的编码,但更改为 ISO-8859-1 也不起作用,因为它是 windows-1252 的子集。
  • ISO-8859-1 对所有可以表示为一个字节而无需更改的字符进行编码。这将在字符串中使用二进制文件,而不会弄乱它。
  • 我不清楚您希望编码如何工作,因为 windows-1252 会将某些字符转换为一两个字节,反之亦然。这意味着您可能无法从 4 个字节中获得 4 个字符。
  • 使用 windows-1252 的原因是由于以下事实, - 当我尝试使用 windows 操作系统(windows-1252 默认编码)时,代码相同,一切正常 - Linux 的默认编码为 UTF- 8 所以我把它改成了windows的默认值,但没有成功。
猜你喜欢
  • 2012-02-22
  • 2021-09-20
  • 2018-08-15
  • 1970-01-01
  • 2011-08-24
  • 2010-09-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多