【问题标题】:Sending a byte stream from a java program to a device running C将字节流从 java 程序发送到运行 C 的设备
【发布时间】:2019-02-05 20:09:46
【问题描述】:

我正在使用支持小端字节序的设备。我如何在 Java 中做到这一点?

我已经从十六进制数据创建了一个字节流并将其写入套接字输出流。我应该以以下格式发送数据。

协议版本:0x0001

Request_Code:0x0011

Request_Size:0x00000008

String s = "0001001100000008";
byte[] bytes = hexStringToByteArray(s);
socket.getOutputStream().write(bytes);

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;
} 

但是,我没有收到设备对此请求的任何响应。我做错了吗?

【问题讨论】:

  • 如果你在C端调试你的程序,它会收到协议版本、请求代码和请求大小的哪些数据?
  • 要明确一点:您似乎发送的是字符数据,而不是“二进制”中的数字,因此不清楚是否需要“小端”。你能确认你应该发送什么吗?是 ASCII/UTF-8 还是您需要实际将数据作为二进制字发送?
  • 我不是在C端调试。我无权访问它。
  • 需要在服务器上调试。你能设置一个从服务器复制代码的测试服务器吗?
  • 嘿@markspace 我是新手,所以我不确定。该文档说“通过 Ipv4-1 通信协议传输的所有数据均采用 Little Endian (Intel) 字节顺序”。我想我必须将十六进制数据作为小端字节数组发送。

标签: java endianness


【解决方案1】:

这是一个使用 ByteBuffer 的示例。代码未经测试,因此请确保它适合您。

ByteBuffer bb = new ByteBuffer.allocate( 1024 );

short version = 0x0001;
short request = 0x0011;
int size = 0x08;

bb.order( ByteOrder.LITTLE_ENDIAN );
bb.put( version );
bb.put( request );
bb.put( size );

socket.getChannel().write( bb );

【讨论】:

    猜你喜欢
    • 2014-04-19
    • 1970-01-01
    • 1970-01-01
    • 2012-04-09
    • 2015-01-25
    • 1970-01-01
    • 2017-05-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多