【问题标题】:somehow working with unsigned bytes in Java以某种方式在 Java 中处理无符号字节
【发布时间】:2012-12-02 17:42:29
【问题描述】:

我正在尝试创建一个 Java 程序来编写文件供我的 Adruino 读取。 Arduino 是一个简单的 8 位微控制器板,加上一些额外的硬件,可以从 SD 卡中逐字节读取文本文件。

事实证明,这比我想象的要难得多。首先,Java 中没有无符号值。由于某种原因,甚至没有字节!即使尝试将一个字节设置为 0xFF 也可能会导致精度错误!这对于这个低级代码不是很有用..

我会使用整数并且只使用正值,但我喜欢在我的很多代码中使用字节溢出来发挥我的优势(尽管我可能会在数学运算之后立即使用模数或其他东西)和最大的问题最重要的是我不知道如何将 int 作为 8 位字符添加到稍后写入文件的字符串中。输出是我目前最大的问题。

那么,根据一些用户输入进行无符号位数学运算然后将这些位像每个位都是 ASCII 字符一样写入文件的最佳方法是什么?

【问题讨论】:

  • 为什么需要String?您可以将byte[] 写入文件。字符串只需要冗余转换为byte[]

标签: java arduino low-level


【解决方案1】:

所以,这就是它的工作原理。

可以将 Java 字节视为无符号。唯一能发挥标志作用的地方是

  • 常量:只需将它们转换为字节
  • toString 和 parseInt
  • , >=,

签名不重要的操作

  • 补充
  • 减法
  • 乘法
  • 位算术(>>除外,只需使用>>>代替)

要将字节转换为整数形式的无符号值,只需使用& 0xFF,将它们转换为字节使用(byte)

或者,如果可以接受第三方库,您可能会对 Guava 的 UnsignedBytes 实用程序类感兴趣。 (披露:我为 Guava 做出了贡献。)

【讨论】:

  • 我没有投反对票,但我忘了投赞成票,所以我想我会这样做的。
  • 在位算术中无关紧要是不正确的。如果您进行像&| 这样的按位运算,则字节将首先扩展为一个int。如果字节恰好以 1 开头,则意味着它将在扩展中用 1 填充,否则为 0。如果您可以选择无符号字节,则它将始终为 0。这会导致过多的屏蔽 @ 987654329@ 只是为了在执行您实际想要执行的操作之前字节看起来仍然相同(如果您不这样做,则会出现一些非常模糊的错误)。
猜你喜欢
  • 2019-12-15
  • 1970-01-01
  • 2011-11-02
  • 1970-01-01
  • 1970-01-01
  • 2012-03-11
  • 1970-01-01
  • 2019-10-03
  • 1970-01-01
相关资源
最近更新 更多