一种在Java中处理无符号字节的方法

3
我正在尝试创建一个Java程序,为我的Arduino写入文件。Arduino是一个简单的8位微控制器板,配合一些额外的硬件,可以逐字节读取SD卡中的文本文件。
结果证明这比我想象的要难得多。首先,Java中没有无符号值。甚至出于某种原因,连字节也不行!即使将字节设置为0xFF也会出现可能丢失精度的错误!对于这种低级代码来说,这并不是很有用。。
我会使用int并只使用正值,但在我的许多代码中,我喜欢利用字节溢出(虽然在数学运算后我可能可以通过模操作完成这个过程),而最大的问题是我不知道如何将int作为8位字符添加到稍后写入文件的字符串中。输出目前是我面临的最大问题。
那么,基于用户输入执行无符号位运算,然后将这些位作为ASCII字符写入文件的最佳方法是什么?

为什么需要一个 String?你可以将 byte[] 写入文件。使用字符串只会需要多余的转换成 byte[] - Esailija
1个回答

3
所以,这是它的工作方式。
您可以将Java字节视为无符号。唯一需要考虑符号的地方是:
- 常量:只需将它们转换为字节 - toString和parseInt - 除法 - <,>,>=,<=
不需要考虑有符号性的操作包括:
- 加法 - 减法 - 乘法 - 位运算(除了>>,请改用>>>
要将字节转换为其无符号值作为int,请使用& 0xFF,要将它们转换为字节,请使用(byte)
或者,如果接受第三方库,您可能会对Guava的UnsignedBytes实用程序类感兴趣。(披露:我为Guava做出了贡献。)

我没有给它投反对票,但我忘记赞成它了,所以我现在会去赞成它的。 - Laurens Weyn
1
在位运算中,这并不是无关紧要的。如果您执行像&|这样的按位操作,则字节将首先扩展为int。如果字节恰好以1开头,则表示它将在扩展时填充为1,否则为0。如果您可以选择无符号字节,则始终为0。这导致大量掩码x&0xFF,以便字节在执行实际想要执行的操作之前仍然看起来相同(如果不这样做,则会出现一些非常晦涩的错误)。 - Vala

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接