Visual Basic读取.BIN文件异常:为何结果为ASCII码而非十六进制值?
嘿,这个问题其实是把文本字符串和原始二进制数据搞混啦,我来给你拆解清楚:
问题根源
你用记事本输入的10101011是8个独立的ASCII字符(就是我们平时打出来的'1'和'0'),而不是一个8位的二进制字节值。记事本是纯文本编辑器,它根本不懂什么"二进制字节"——当你以ANSI编码保存时,它会把每个字符转换成对应的ASCII编码存在文件里:
- 字符'1'对应的ASCII码是十进制49(十六进制
0x31) - 字符'0'对应的ASCII码是十进制48(十六进制
0x30)
所以你的binary.bin文件里实际存的是8个连续的字节:0x31 0x30 0x31 0x30 0x31 0x30 0x31 0x31,而不是你想要的单个字节0xAB(也就是二进制10101011对应的数值)。你的VB代码读取了文件的第一个字节,自然就拿到了第一个字符'1'的ASCII码49,和预期完全不符。
正确创建目标二进制文件的方法
要得到存储单个字节0xAB的文件,不能用记事本,得用能处理原始二进制数据的工具或代码:
方法1:用二进制编辑器创建
找个专门的二进制编辑器(比如HxD、WinHex,都是免费好用的),打开后直接输入十六进制值AB,然后保存成binary.bin就行。
方法2:用VB代码直接生成
如果你想用代码搞定,直接写这段就行:
' 直接写入目标字节0xAB到文件 Dim targetByte As Byte = &HAB My.Computer.FileSystem.WriteAllBytes("E:/test.bin", New Byte() {targetByte}, False)
运行这段代码后,再用你原来的读取代码,TextBox1.Text就会显示171(十进制,对应十六进制0xAB),完全符合你的预期。
额外情况:如果想把文本"10101011"转成二进制字节
要是你本来就是想把文本形式的二进制字符串转换成对应的字节值,那得先做解析再写入:
' 把二进制字符串解析成字节 Dim binaryText As String = "10101011" Dim targetByte As Byte = Convert.ToByte(binaryText, 2) ' 写入文件 My.Computer.FileSystem.WriteAllBytes("E:/test.bin", New Byte() {targetByte}, False)
这段代码会把字符串"10101011"转成十进制171(也就是十六进制0xAB),再写入文件,读取时就能得到正确结果。
内容的提问来源于stack exchange,提问作者Meenie Leis
相关产品推荐
相关产品推荐

