图片隐写时触发java.lang.NumberFormatException错误求助
解决图片隐写中的NumberFormatException问题
嘿,我看你在实现图片隐写(把一张图藏进另一张同类型图里)的时候碰到了这个恼人的异常:
Exception in thread "main" java.lang.NumberFormatException: For input string: "010010101101111111" at java.lang.NumberFormatException.forInputString(Unknown Source) at java.lang.Integer.parseInt(Unknown Source) at java.lang.Integer.parseInt(Unknown Source) at Image.main(Image.java:160)
问题根源分析
这个异常的核心原因是你在Image.java第160行调用Integer.parseInt()时,传入的二进制字符串"010010101101111111"无法被正确解析为int类型,大概率是以下情况:
- 没指定解析进制,默认按十进制处理:如果你写的是
Integer.parseInt("010010101101111111"),Java会把这个字符串当作十进制数解析,但这个数的数值是100101011011111111,远超过了int类型的最大值2147483647(也就是2^31-1),直接触发溢出异常。 - 要是后续处理更长的二进制串,哪怕指定了进制,
int的31位上限也会不够用,同样会抛出异常。
针对性解决方案
根据你的使用场景,给你两个可行的解决办法:
- 明确指定二进制进制解析:如果你要处理的是二进制字符串,一定要在
parseInt里加上第二个参数2,告诉Java按二进制解析:
这个例子里的二进制串转成十进制是// 正确的二进制转int方式 int num = Integer.parseInt("010010101101111111", 2);145535,完全在int的范围内,不会报错。 - 用更大范围的类型处理长二进制串:如果你的隐写逻辑会生成超过31位的二进制字符串(比如处理多像素的连续数据),那
int就不够用了,可以换成Long.parseLong()或者BigInteger:// 处理更长的二进制串,用long类型 long longNum = Long.parseLong(longBinaryStr, 2); // 或者用BigInteger处理任意长度的二进制串 BigInteger bigNum = new BigInteger(anyLengthBinaryStr, 2);
额外小提示
在图片隐写场景中,通常我们只会修改像素的最低1-2位来隐藏数据,这样不会明显改变原图的视觉效果。处理数据的时候建议按像素的二进制位分段处理,避免一次性生成过长的二进制字符串,减少溢出风险。
内容的提问来源于stack exchange,提问作者user123
相关产品推荐
相关产品推荐

