如何将无符号字节转换为有符号字节

How to convert an unsigned byte to a signed byte

我正在尝试将文件中的无符号字节转换为 java 中的有符号字节。这是我从 java:

中的文件中读取无符号字节的当前安排
        ByteArrayOutputStream output = new ByteArrayOutputStream();
        for (String string : fileKeyString) {
            output.write(Integer.valueOf(string).byteValue());
        }
        return output.toByteArray();

Note: I have to use Java 8 and fileKeyString is a String Array that gets created when reading from a file. The variable string holds the unsigned byte. It outputs a byte array which is required.

在将其放入 output.write 并由 .byteValue() 评估之前,我如何将其从无符号字节准确地转换为有符号字节?

我没有太多字节方面的经验,因此不胜感激。

谢谢。

你似乎误解了计算机的工作原理。

一个字节就是一个字节。磁盘或内存中只有 0100110001001100 是什么意思?那是签名的还是未签名的?字节不知道。字节就是 8 位,仅此而已。他们就是这样。与字节交互的东西决定了如何读取它。那个签了?字节不知道 - 看它的软件(或人的眼球)决定它是否。

让我们让它更有趣,并使用字节 10000000

那是什么?字节不知道。也许您有一些软件可以读取这个字节并在屏幕上显示它的值。

根据您使用的软件,您可能会看到以下任何内容,它们都同样正确

  • 128(解释:无符号字节,十进制表示)
  • -128(解释:2s补码有符号字节,十进制表示)
  • 80(解释:十六进制显示,无符号)
  • -80(解释:以十六进制显示,有符号)
  • �(解释:这是一个unicode字符。unicodetable中的第128项是'control',并不是真正的字符perse)。
  • -127(解释:1s补码有符号字节,十进制表示)
  • 屏幕上什么也没有出现,反而是喇叭里传来了Unchained Melody悦耳的旋律(解释:是一首歌的id,Unchained Melody的ID是位序列10000000)。

给定一个仅包含 1 个字节的文件,其位序列为 10000000(这只是一个字节序列,没有元数据),您不知道以上哪种解释是正确的。从这个意义上说,他们都是正确的。我可以为您制作一个文件,如果您将其命名为 'foo.zip' 并解压缩,它会生成 1 个文件,其中包含莎士比亚作品集的纯文本格式。如果将 .zip 重命名为 .png,然后打开它,您会看到蒙娜丽莎。在任何一种情况下都是相同的字节 - 是读取它们的应用程序导致那些完全相同的字节意味着完全不同的东西。

完全相同的原则(不是字节本身,是软件或人眼决定了它的含义)也适用于相反的情况:如果我想 'write' Unchained Melody 到磁盘,它是决定如何做的软件。

考虑到这一点,因此:

How would I exactly convert this from an unsigned byte to signed bytes before it gets placed into output.write and evaluated by .byteValue()?

这个问题毫无意义。如果我有数字 -128 并且我想将它写入磁盘,大概你只是将位序列 10000000 写入磁盘,是的,除非计算机用户再次打开该文件,否则这没有任何意义 与您的应用。或者任何其他知道它将被解释为带符号的 2 的补码字节的应用程序。

你的代码已经写了1个字节到磁盘,位序为10000000;你已经这样做了,你的代码没有问题。

如果您打开它时显示 'this file contains +128',而您希望显示“-128”,则您无法在文件编写代码中进行任何更改。相反,您需要找到不同的软件来打开它,或者以不同的方式配置该软件。

找到了!超过128就减256.

if (byte >= 128) { byte -= 256; }