java readunsignedint,Java读取unsigned int,存储并将其写回

博客内容涉及到在QuickTime文件中读取和写入无符号整数的问题。作者目前将无符号整数读入为Long类型,但在写回时无法正确以4字节无符号整数形式保存。提供的代码片段展示了尝试通过拆分Long并写入两个无符号短整数来实现这一目标,但遇到了数值范围限制和精度丢失的问题。解决方案建议直接将Long类型转换为int并写入,经过验证,这种方法能够正确读写所需数值。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

I need to read an unsigned int from a quicktime file, and write it back to another quicktime file.

Currently I read the unsigned int into a Long but while writing it back I never managed to write the exact number back in 4 bytes as unsigned int. The long has the correct value that I need to write back.

(eg 3289763894 or 370500)

I am unable to even read the write a number smaller then Integer.MAX_VALUE (eg 2997).

I am using the following methods to write the value back

public void writeUInt32(long uint32,DataOutputStream stream) throws IOException {

writeUInt16((int) (uint32 & 0xffff0000) >> 16,stream);

writeUInt16((int) uint32 & 0x0000ffff,stream);

}

public void writeUInt16(int uint16,DataOutputStream stream) throws IOException {

writeUInt8(uint16 >> 8, stream);

writeUInt8(uint16, stream);

}

public void writeUInt8(int uint8,DataOutputStream stream) throws IOException {

stream.write(uint8 & 0xFF);

}

Any help would be appreciated.

解决方案

Just write your long casted to int. I checked:

PipedOutputStream pipeOut = new PipedOutputStream ();

PipedInputStream pipeIn = new PipedInputStream (pipeOut);

DataOutputStream os = new DataOutputStream (pipeOut);

long uInt = 0xff1ffffdL;

System.out.println ("" + uInt + " vs " + ((int) uInt));

os.writeInt ((int) uInt);

for (int i = 0; i < 4; i++) System.out.println (pipeIn.read ());

uInt = 0x000ffffdL;

System.out.println ("" + uInt + " vs " + ((int) uInt));

os.writeInt ((int) uInt);

for (int i = 0; i < 4; i++) System.out.println (pipeIn.read ());

Output is4280287229 vs -14680067

255

31

255

253

1048573 vs 1048573

0

15

255

253as expected

严重: Could not load font file: C:\Windows\FONTS\mstmc.ttf java.io.EOFException at org.apache.fontbox.ttf.TTFDataStream.readUnsignedInt(TTFDataStream.java:151) at org.apache.fontbox.ttf.TTFParser.readTableDirectory(TTFParser.java:312) at org.apache.fontbox.ttf.TTFParser.parse(TTFParser.java:139) at org.apache.fontbox.ttf.TTFParser.parse(TTFParser.java:87) at org.apache.pdfbox.pdmodel.font.FileSystemFontProvider.addTrueTypeFont(FileSystemFontProvider.java:657) at org.apache.pdfbox.pdmodel.font.FileSystemFontProvider.scanFonts(FileSystemFontProvider.java:379) at org.apache.pdfbox.pdmodel.font.FileSystemFontProvider.<init>(FileSystemFontProvider.java:358) at org.apache.pdfbox.pdmodel.font.FontMapperImpl$DefaultFontProvider.<clinit>(FontMapperImpl.java:140) at org.apache.pdfbox.pdmodel.font.FontMapperImpl.getProvider(FontMapperImpl.java:159) at org.apache.pdfbox.pdmodel.font.FontMapperImpl.findFont(FontMapperImpl.java:423) at org.apache.pdfbox.pdmodel.font.FontMapperImpl.getCIDFont(FontMapperImpl.java:503) at org.apache.pdfbox.pdmodel.font.PDCIDFontType0.<init>(PDCIDFontType0.java:130) at org.apache.pdfbox.pdmodel.font.PDFontFactory.createDescendantFont(PDFontFactory.java:135) at org.apache.pdfbox.pdmodel.font.PDType0Font.<init>(PDType0Font.java:196) at org.apache.pdfbox.pdmodel.font.PDFontFactory.createFont(PDFontFactory.java:97) at org.apache.pdfbox.pdmodel.PDResources.getFont(PDResources.java:146) at org.apache.pdfbox.contentstream.operator.text.SetFontAndSize.process(SetFontAndSize.java:66) at org.apache.pdfbox.contentstream.PDFStreamEngine.processOperator(PDFStreamEngine.java:933) at org.apache.pdfbox.contentstream.PDFStreamEngine.processStreamOperators(PDFStreamEngine.java:515) at org.apache.pdfbox.contentstream.PDFStreamEngine.processStream(PDFStreamEngine.java:489) at org.apache.pdfbox.contentstream.PDFStreamEngine.processPage(PDFStreamEngine.java:156) at org.apache.pdfbox.rendering.PageDrawer.drawPage(PageDrawer.java:275) at org.apache.pdfbox.rendering.PDFRenderer.renderPageToGraphics(PDFRenderer.java:458) at org.apache.pdfbox.printing.PDFPrintable.print(PDFPrintable.java:263) at sun.print.RasterPrinterJob.printPage(RasterPrinterJob.java:2165) at sun.print.RasterPrinterJob.print(RasterPrinterJob.java:1547) at sun.print.RasterPrinterJob.print(RasterPrinterJob.java:1390) at org.example.PdfBoxPrintDemo.main(PdfBoxPrintDemo.java:41)这是什么错误
04-01
<think>好的,用户遇到了一个Java错误:“严重: Could not load font file: C:\Windows\FONTS\mstmc.ttf”,后面跟着一堆堆栈跟踪,主要是Apache PDFBox相关的。我需要帮用户分析这个问题。 首先,错误信息指出无法加载字体文件mstmc.ttf,导致EOFException。EOFException通常意味着程序在读取文件时意外到达了文件末尾,可能是因为文件损坏或不完整。用户可能是在使用PDFBox处理或打印PDF文件时遇到了这个问题。 接下来,我需要考虑mstmc.ttf是什么字体。这个字体文件看起来是微软的某种字体,可能和数学符号有关。不过,可能存在的情况是,这个字体文件在系统中不存在,或者权限问题导致无法访问,或者文件本身损坏。 然后,分析堆栈跟踪。错误发生在TTFParser的parse方法,说明PDFBox在解析字体文件时失败了。可能是在处理PDF文档时,文档中引用了mstmc.ttf字体,但系统里没有这个字体,或者字体文件有问题。 解决方案方面,首先应该检查系统中是否存在这个字体文件。用户可以到C:\Windows\Fonts目录下查找mstmc.ttf是否存在。如果不存在,可能需要安装或恢复该字体。如果存在,可能需要检查文件是否损坏,比如尝试复制到其他位置是否能打开。 另外,可能PDF文档中嵌入了这个字体,但PDFBox在加载时出现问题。用户可以考虑在代码中设置PDFBox忽略缺少的字体,或者使用系统字体替代。例如,使用PDFBox的FontMapper来替换缺失的字体。 还有可能用户的PDFBox版本较旧,存在已知的字体处理问题,升级到最新版本可能解决。或者检查代码中是否有处理字体的特定设置需要调整,比如禁用字体缓存等。 最后,用户可能需要确认他们的应用程序是否有权限访问系统字体目录。有时候权限问题会导致无法读取字体文件,尤其是当应用运行在受限制的环境中时。 总结一下,可能的解决步骤包括检查字体文件是否存在、修复或替换字体文件、更新PDFBox版本、配置字体替换策略,以及检查文件权限。需要根据具体情况一步步排查。</think>这是一个与Java PDF处理库**Apache PDFBox**相关的字体加载错误。以下是逐步分析及解决方案: --- ### **错误原因分析** 1. **字体文件缺失或损坏** PDFBox在尝试加载系统字体`mstmc.ttf`时失败。该字体可能: - 不存在于路径`C:\Windows\FONTS\` - 文件内容不完整或已损坏(导致`EOFException`,即读取到文件末尾时未预期结束) 2. **mstmc.ttf 是什么字体?** `mstmc.ttf`是微软的**数学符号字体**(Microsoft Symbol Font),用于显示数学公式中的特殊符号。某些旧版PDF文件可能会引用此字体。 --- ### **解决方案** #### 1. **检查字体文件是否存在** - 打开路径 `C:\Windows\Fonts\`,搜索 `mstmc.ttf`。 - **若存在** → 尝试复制到其他目录测试是否能正常打开(右键选择“安装”或双击预览)。 - **若不存在** → 需要从其他系统或合法来源恢复此字体。 #### 2. **修复或替换字体文件** - **重新安装字体**: 从可信来源下载`mstmc.ttf`,将其复制到`C:\Windows\Fonts`,重启应用。 - **替代字体映射**: 在PDFBox代码中设置默认字体替换策略,例如: ```java PDFontMapper fontMapper = new DefaultFontMapper(); fontMapper.useSystemFonts(true); // 允许使用系统字体替代 ``` #### 3. **更新PDFBox版本** 旧版PDFBox可能存在字体解析问题。升级到最新版本: ```xml <!-- Maven依赖示例 --> <dependency> <groupId>org.apache.pdfbox</groupId> <artifactId>pdfbox</artifactId> <version>3.0.2</version> <!-- 当前最新版 --> </dependency> ``` #### 4. **禁用字体缓存(临时测试)** 在代码中禁用字体缓存,强制重新加载字体: ```java System.setProperty("org.apache.pdfbox.rendering.UsePureJavaCMYK", "true"); ``` #### 5. **检查文件权限** 确保Java进程有权限访问`C:\Windows\Fonts\`目录。 --- ### **附加建议** - 如果错误出现在**打印PDF时**,可尝试将PDF导出为图像再打印。 - 使用工具如`FontForge`验证字体文件完整性。 - 对于生产环境,建议在代码中处理字体缺失异常,例如: ```java try { // PDF处理代码 } catch (IOException e) { // 记录日志替换为默认字体 } ``` --- **总结**:此错误通常由字体文件问题引发,通过修复字体文件或调整PDFBox配置即可解决。若需进一步排查,可提供PDF文件片段或完整堆栈跟踪。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值