java - 将 5 个字节转换为整数

标签 java python int type-conversion byte

我有一些奇怪的数据存储在 5 个字节中,我需要能够将其转换为 int 以便能够更轻松地操作它。我已经有一些 Python 代码(提供给我)可以执行此操作,但我需要能够在 Java 中找到解决方案。我认为我现在的问题是 Python 和 Java 存储字节的方式不同。

Python(98% 确定它可以正常工作):

def bin5(b,k):
  """ Returns binary integer from bytes k,k+1,...,k+4 in b."""
  b0 = b[k  ]
  b1 = b[k+1]
  b2 = b[k+2]
  b3 = b[k+3]
  b4 = b[k+4]
  if b0<0: b0 += 256
  if b1<0: b1 += 256
  if b2<0: b2 += 256
  if b3<0: b3 += 256
  if b4<0: b4 += 256
  return b0*65536.0+b1*256.0+b2+b3/256.0+b4/65536.0

Java 尝试:

  // Returns binary integer from bytes k,k+1,...,k+4 in b.
  private static int bin5(byte[] b, int k) {
    byte b0 = b[k];
    byte b1 = b[k + 1];
    byte b2 = b[k + 2];
    byte b3 = b[k + 3];
    byte b4 = b[k + 4];
    return (int)(b0 * 65536.0 + b1 * 256.0 + b2 + b3 / 256.0 + b4 / 65536.0);
  }

我确定问题出在 Java 代码的最后一个 return 语句中。此外,它适用于某些字节数组,但不适用于其他字节数组。我找不到这种行为的原因。

编辑:示例: 如果 Python 代码分别读取 b0 到 b5 的字节:0 11 -72 0 0,它会将 -72 更改为 184 并然后根据上面的等式计算值3000.0。根据调查/数据参数,该值是正确的。

我的直觉表明 python 代码对于某些值来说是错误的。其中一个值是当它读取值 0 -127 -66 0 0(分别为 b0 到 b5)时,该值会变成:0 129 190 0 0,然后值 33214 是转换后的输出。根据调查/数据参数,这是不可能的。但这有可能是一个错误的数据点。

编辑2: 0 13 9 0 0 应该返回 3337(在 python 代码中也是如此)。然而在 Java 下,它返回 3593。

最佳答案

你可以做

private static double bin5(byte[] b, int k) {
    int b0 = b[k] & 0xFF;     // treat as unsigned byte
    int b1 = b[k + 1] & 0xFF;
    int b2 = b[k + 2] & 0xFF;
    int b3 = b[k + 3] & 0xFF;
    int b4 = b[k + 4] & 0xFF;
    return (b0 * 65536 + b1 * 256 + b2 + b3 / 256.0 + b4 / 65536.0);
}

由于 2 的幂可以用 double 精确表示,因此不会出现任何舍入误差。

关于java - 将 5 个字节转换为整数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22389977/

相关文章:

java - java中的代码执行顺序

java - 需要 java double 才能不向下舍入

java - 出现不正确的 SQL 语法

python - 我可以在 Python 3.6 之前的版本中使用 secrets 模块吗?

python - 使用 for 循环重命名 Pandas 数据框列

python - 将 TFLite 转换为 Lite

python - 按数字对字符串进行排序

java - Android 版本 > 2.3 上的 FileNotFoundException

java - 为什么我的 tomcat 取消部署任务不起作用

java - 如何按名称模式从 IntelliJ 代码覆盖范围中排除文件?