【问题标题】:How to serialize a decimal value (double) to a uint32 in Java?如何在 Java 中将十进制值(双精度)序列化为 uint32?
【发布时间】:2017-02-03 20:10:22
【问题描述】:

到目前为止,我一直在使用以下代码将有符号值转换为无符号值,我需要将这些值作为字节数组通过 UDP 发送到嵌入式系统。

   public static byte serializeShort(short a)
{
    return ((byte) (a & 0xFF));
}

public static short serializeInt(int a)
{
    return ((short) (a & 0xFFFF));
}

public static int serializeLong(long a)
{
    return ((int) (a & 0xFFFFFFFF));
}

long 的问题是一些值可以是实值。我通过 put()、putInt() 或 putShort() 将这个方法的输出放入字节缓冲区。

知道如何将双精度类型的有符号转换为无符号吗?

这是我的问题:

我有一个正在填充的 UINT32 值。我正在用 java 签名的 LONG 或 java 签名的 double 填充我的字节缓冲区。我用上面的'serializeLong()' 来做long,它工作得很好,但是双打却不行。

ByteBuffer buffer = ByteBuffer.allocate(SIZE);
if (value instanceof Long)
    {
        buffer.putInt(Util.serializeLong((Long) value));
    } else
    {
        buffer.putInt(Util.serializeLong(Double.doubleToLongBits((Double) value)));
    }

【问题讨论】:

  • 您尝试了哪些方法,哪些方法不起作用?我假设您已经尝试了显而易见的方法,但这是不对的,那么问题是什么?
  • 顺便说一句 ((byte) (a & 0xFF))(byte) a 相同
  • 你为什么要序列化到一半大小?你不能那样做。此外,你所要做的就是强制转换,因为 Java 的 narrowing primitive conversion 会做你想做的事。
  • 所有这些都是从 UINT8、UINT16、UINT32 到 java 对象来回转换,所以当我写回它们时,我需要将值转换回无符号并减少它所以它适合可用的字节范围。
  • 您可能正在寻找Double.doubleToLongBits(double)

标签: java serialization unsigned


【解决方案1】:

您应该使用浮点数并将其放入 uint32 空间,而不是使用 Double,使用:buffer.putInt((Float.floatToRawIntBits(Math.abs((Float) value))));

【讨论】:

  • 四天前提出的建议您完全忽略了它。
猜你喜欢
  • 1970-01-01
  • 2014-02-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-07-31
  • 2022-07-21
相关资源
最近更新 更多