Tcl/Tk生成二进制文件输出与输入不符问题排查
问题分析与解决
你的Tcl/Tk脚本生成单像素BMP时出现额外数据,核心问题出在文件打开模式,还有一处调试输出的小问题:
1. 文件打开模式错误
Tcl里用open text.bin w是文本模式打开文件,在Windows系统下,文本模式会自动把换行符\n(0x0A)转换成\r\n(0x0D0A)。如果BMP二进制数据里恰好包含0x0A,就会被额外插入0x0D,导致文件多出不必要的字节。
解决方法:改用二进制模式打开文件,写入用wb,读取用rb,避免系统自动转换字节。
2. 控制台输出二进制数据的问题
puts "Format done: $outBinData"会把二进制数据输出到控制台,由于控制台编码限制,会显示乱码甚至截断,但这不会影响文件内容,只是调试输出的干扰,建议注释或删除该行。
修正后的脚本
#!/usr/bin/tclsh if 0 { # One pixel BMP image 0000000 4d42 003a 0000 0000 0000 0036 0000 0028 0000010 0000 0001 0000 0001 0000 0001 0018 0000 0000020 0000 0004 0000 104d 0000 104d 0000 0000 0000030 0000 0000 0000 b8b8 00e9 000003a } set hex1 "424d3a00000000000000360000002800" set hex2 "00000100000001000000010018000000" set hex3 "0000040000004d1000004d1000000000" set hex4 "000000000000b8b800e9" # 二进制模式写入文件 set fp [open text.bin wb] set outBinData [binary format H* $hex1$hex2$hex3$hex4] # 注释掉二进制数据的控制台输出,避免乱码干扰 # puts "Format done: $outBinData" puts -nonewline $fp $outBinData close $fp # 二进制模式读取文件验证 set fp [open text.bin rb] set inBinData [read $fp] close $fp # 可选:验证文件大小是否为预期的58字节 puts "文件大小: [file size text.bin] 字节"
验证结果
修正后生成的text.bin文件大小应为58字节,和注释里的BMP数据长度一致,用十六进制编辑器查看会发现和预期的单像素BMP数据完全匹配。
内容的提问来源于stack exchange,提问作者Nadelina
相关产品推荐
相关产品推荐

