Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/file/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Java中,如何将文件读取为无符号字节?_Java_File_Byte - Fatal编程技术网

在Java中,如何将文件读取为无符号字节?

在Java中,如何将文件读取为无符号字节?,java,file,byte,Java,File,Byte,如何在Java中将文件读取为字节 需要注意的是,所有字节都必须为正,即不能使用负范围 这可以用Java实现吗?如果可以,如何实现 我需要能够将一个文件的内容乘以一个常数。我假设我可以将字节读入一个BigInteger,然后进行乘法,然而,由于一些字节是负数,我最终得到的结果是12 13 15-12等等,然后陷入困境。好吧,Java没有无符号字节的概念。。。字节类型始终是有符号的,其值介于-128到127之间(包括-128和127)。但是,这将与使用无符号值的其他系统进行良好的互操作,例如,C#代

如何在Java中将文件读取为字节

需要注意的是,所有字节都必须为正,即不能使用负范围

这可以用Java实现吗?如果可以,如何实现


我需要能够将一个文件的内容乘以一个常数。我假设我可以将字节读入一个BigInteger,然后进行乘法,然而,由于一些字节是负数,我最终得到的结果是12 13 15-12等等,然后陷入困境。

好吧,Java没有无符号字节的概念。。。
字节
类型始终是有符号的,其值介于-128到127之间(包括-128和127)。但是,这将与使用无符号值的其他系统进行良好的互操作,例如,C#代码写入一个字节“255”将生成一个文件,其中相同的值在Java中读取为“-1”。小心点,你会没事的

编辑:您可以使用位掩码非常轻松地将有符号字节转换为具有无符号值的
int
。例如:

byte b = -1; // Imagine this was read from the file
int i = b & 0xff;
System.out.println(i); // 255
使用
int
完成所有算术运算,然后在需要再次写出时返回到
byte

通常使用或可能使用从文件中读取二进制数据


现在很难知道你还想要什么。。。如果您能在问题中提供更多详细信息,我们可能会为您提供更多帮助。

如果在内部使用更大的整数类型不是问题,只需使用简单的解决方案,在所有整数相乘之前将128相加即可。不是-128到127,而是0到255。加法并不难;)

另外,请记住Java中的算术运算符和位运算符只返回整数,因此:

byte a = 0;
byte b = 1;

byte c = a | b;
将给出编译时错误,因为a | b返回整数。你必须这么做

byte c = (byte) a | b;
因此,我建议在将数字相乘之前,先将128加到所有数字中。

您在一条评论中写道(请将这些信息放在问题中-这里有一个编辑链接):


我需要能够将一个文件的内容乘以一个常数。 我假设我可以将字节读入一个大整数,然后 乘法,但是由于一些字节是负数,所以我结束 在12-13-15-12等情况下被卡住

如果要将整个文件用作BigInteger,请在字节[]中读取它,并将此数组(作为一个整体)提供给BigInteger构造函数

/**
 * reads a file and converts the content to a BigInteger.
 * @param f the file name. The content is interpreted as
 *   big-endian base-256 number.
 * @param signed if true, interpret the file's content as two's complement
 *                  representation of a signed number.
 *               if false, interpret the file's content as a unsigned
 *                  (nonnegative) number.
 */
public static BigInteger fileToBigInteger(File f, boolean signed)
    throws IOException
{
    byte[] array = new byte[file.length()];
    InputStream in = new FileInputStream(file);
    int i = 0; int r;
    while((r = in.read(array, i, array.length - i) > 0) {
        i = i + r;
    }
    in.close();
    if(signed) {
        return new BigInteger(array);
    }
    else {
        return new BigInteger(1, array);
    }
}
然后,您可以将BigInteger相乘,并将结果保存在新文件中(使用
toByteArray()
方法)

当然,这完全取决于文件的格式-我的方法假定文件包含
toByteArray()
方法的结果,而不是其他格式。如果您有其他格式,请在问题中添加相关信息


“我需要能够将一个文件的内容乘以一个常数。”这似乎是一个相当可疑的目标-您真正想做什么?

一些测试显示,这将从文件中逐个返回[0…255]范围内的无符号字节值:

Reader bytestream = new BufferedReader(new InputStreamReader(
        new FileInputStream(inputFileName), "ISO-8859-1"));
int unsignedByte;
while((unsignedByte = bytestream.read()) != -1){
    // do work
}
它似乎适用于该范围内的所有字节,包括ISO 8859-1中未定义字符的字节。

。这将比手动铸造和掩蔽干净得多


要将
int
转换回
byte
,当然,您只需要一个cast
(byte)值

,我需要能够将文件内容乘以一个常量。我假设我可以将字节读入一个BigInteger,然后再进行乘法,但是由于一些字节是负数,我最终得到的结果是12 13 15-12等,并陷入困境。@tyr您是将每个字节单独相乘,还是基于读取的几个字节构造一个
BigInteger
?如果是后者,我不明白为什么要将字节转换为无符号表示形式。我正在基于字节read yes构造一个BigInteger。我之所以要转换它们,是因为当我用BigInteger“12-1213”向方法馈送数据时,会生成一个异常。java.lang.NumberFormatException:非法嵌入减号读取的字节是biginteger中的简单串联,一个字节挨着另一个。@tyr啊,你在传递字符串。我以为你的意思是要传递一个字节数组来构造
biginger
。对不起,假设他想把2的补码转换成无符号,那就行不通了。例如,-1+128等于127,而不是应该的255。此外,回溯到字节将更改字节范围之外的任何值。Object
DataInputStream
提供了
readUnsignedByte()
方法