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