java - 我需要帮助 : Send a list of bytes with UDP to a Server, o 它适用于有符号/无符号字节

标签 java android udp unsigned signed

我有以下问题: 我必须使用 udp 将字节列表从我的 Android 手机发送到旧服务器。因为在java中字节是有符号的,所以服务器总是接收到很多字节。他不再是 36 字节,而是 72 字节。因此,字节列表的解释在服务器端不起作用。

服务器上正确的解释是: 23 80 82 88 F2 F2 8C F7 B8 FC 9B 88 98 91 82 84 89 80 90 E5 AA 82 C0 83 AB BE 87 BC D3 C0 95 80 80 16 0D 0A 354242055139836 2013-19-02 17:16:18 47,41413 9,3971 879m 273,2° 0km/h

我的错误结果是: 32 33 38 30 38 32 38 38 46 32 46 32 38 43 46 37 42 38 46 43 39 42 38 38 39 38 39 31 38 32 38 31 38 30 38 30 39 30 45 35 4 4 32 38 32 43 30 38 33 41 42 42 42 38 37 41 43 44 33 43 30 39 35 38 30 38 30 37 44 30 44 30 41

有人知道我如何发送这个字节列表吗?它应该是 36 个无符号字节?

我的 Android 应用程序代码是:

public class UdpClient extends IntentService {

public static final String REQUEST_STRING = "sharedText";

public UdpClient() {
    super("UdpClient");
}

@Override
public void onHandleIntent(Intent intent) {
    String requestString = intent.getStringExtra(REQUEST_STRING);
    String action = intent.getAction();
    String type = intent.getType();

    if (Intent.ACTION_SEND.equals(action) && type != null) {
        if ("text/*".equals(type)) {
            runUdpClient(requestString); // Handle text being sent
        }
    }
}

@SuppressLint("DefaultLocale")
public static String getSum(String in) {
    int checksum = 0;
    if (in.startsWith("$")) {
        in = in.substring(1, in.length());
    }

    int end = in.indexOf('*');
    if (end == -1)
        end = in.length();
    for (int i = 0; i < end; i++) {
        checksum = checksum ^ in.charAt(i);
    }
    String hex = Integer.toHexString(checksum);
    if (hex.length() == 1)
        hex = "0" + hex;
    return hex.toUpperCase();
}

private static final int UDP_SERVER_PORT = 11111;

@SuppressLint("DefaultLocale")
private void runUdpClient(String string) {

    String sharedText = string.toUpperCase();

    String checksum = null;

    if (sharedText != null) {
        // Update UI to reflect text being shared
        checksum = getSum(sharedText);
    }

    String udpMsg = "23" + sharedText + checksum + "0D0A";

    DatagramSocket ds = null;

    try {
        ds = new DatagramSocket();
        InetAddress serverAddr = InetAddress.getByName("127.0.0.1");
        DatagramPacket dp;

        byte[] sendData = new byte[36];

        sendData = udpMsg.getBytes("ISO-8859-1");

        dp = new DatagramPacket(sendData, sendData.length, serverAddr,
                UDP_SERVER_PORT);
        ds.send(dp);
    } catch (SocketException e) {
        e.printStackTrace();
    } catch (UnknownHostException e) {
        e.printStackTrace();
    } catch (IOException e) {
        e.printStackTrace();
    } catch (Exception e) {
        e.printStackTrace();
    } finally {
        if (ds != null) {
            ds.close();
        }
    }
}

}

最佳答案

您需要使用类似以下内容将 udpMsg 十六进制字符串转换为字节数组:

import javax.xml.bind.DatatypeConverter;
sendData = DatatypeConverter.parseHexBinary(udpMsg);

编辑:试试这个 method相反,我猜 Android 没有 XML 类。

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

关于java - 我需要帮助 : Send a list of bytes with UDP to a Server, o 它适用于有符号/无符号字节,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14970338/

相关文章:

java - 更改 Spring 存储库方法中的优先级

java - 如何使用 Jersey 序列化为 Json? (我正在使用 Gradle )

c - 单个主机的阻塞与非阻塞 UDP 套接字

c - 使用套接字 API 在 C 中转发 UDP 数据包

c - VLAN上的UDP套接字单播/多播问题

java - JDK11中LinkedHashMap中的死代码吗?

java - 如何使 Eclipse 格式化程序在类型注释声明中的数组后面添加新行?

android - JitPack 不会使用 GitHub 存储库 - 包含演示该问题的示例存储库

Android-SupportMapFragment 显示空白 map

java - Android Architecture Blueprints "todo‑mvp‑dagger",@Provides for TasksRepository 在哪里?