回 帖 发 新 帖 刷新版面

主题:求救呀!急呀!

告诉我!为什么 b_Height 会等于 124 应该是 132 才对呀!!我不明白!请高手指点呀!
这是 Theaa.bmp 文件的数据

C:\>debug d:\theaa.bmp
-d
0AEF:0100  42 4D 80 29 00 00 00 00-00 00 3E 00 00 00 28 00   BM.)......>...(.
0AEF:0110  00 00 72 02 00 00 84 00-00 00 01 00 01 00 00 00   ..r.............
0AEF:0120  00 00 42 29 00 00 25 2E-00 00 25 2E 00 00 00 00   ..B)..%...%.....
0AEF:0130  00 00 00 00 00 00 FF FF-FF 00 00 00 00 00 00 00   ................
0AEF:0140  00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00   ................
0AEF:0150  00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00   ................
0AEF:0160  00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00   ................
0AEF:0170  00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00   ................

下面是我写的程序 是用 Corel Script 写的!

Declare Function GetDec(Byval Char As String) As Long
Dim File_size        As Long    ' 文件大小
Dim Offset            As Long    ' 图像数据偏移地址
Dim Header_size        As Long    ' 信息头大小
Dim b_Width            As long ' 图像的宽度
Dim b_Height        As long ' 图像的高度
Dim Temp    As String

Open "D:\Theaa.bmp" For Input As #1
    Seek 1, &h0001
    Temp = Input(2, 1)
    If Temp <> "BM" Then Goto Err
    Temp = ""
    Seek 1, &h0003
    File_size = GetDec(Input(4, 1))
    Seek 1, &h000B
    Offset = GetDec(Input(4, 1))
    Seek 1, &h000F
    Header_size = GetDec(Input(4, 1))
    Seek 1, &h0013
    b_Width = GetDec(Input(4,1))
    Seek 1, &h0017
    Temp = Input(4,1)
    b_Height = GetDec(Temp)
Close 1

Message "File size: " & Cstr(File_size) & " Byte" \\
        & Chr(13) & "Offset: " & Cstr(Offset) & " Byte"\\
        & Chr(13) & "Header_size: " & Hex(Header_size) & "H Byte"\\
        & Chr(13) & "b_Width: " & b_Width & " px"\\
        & Chr(13) & "b_Height: " & b_Height & " px"
End
Err:
    Message "错误!"
    
Function GetDec(Byval Char As String) AS Long
    Dim index        AS Long
    Dim  temp        AS String
    Dim  str_temp    AS String
    
    For index = Len(Char) To 1 Step -1
        temp = Cstr(ASC(Mid(Char, index, 1)))
        If Len(temp) > 1 And Left(temp, 1) = "-" Then
            temp = Mid(temp, 2, Len(temp))
        End If
        str_temp = str_temp & Hex(Clng(Temp))
    Next            
    GetDec = Dec(str_temp)
End Function

回复列表 (共13个回复)

11 楼

我知道错误在这里! ASC(Mid(Char, index, 1))

但是我不明白为什么当文件读&h0017这个位置的4个字节时 :
       对应的数据是 132 即 &h84 ,可程序读出来怎么会是 -124
       还有!当 84 所在的位置数据为 80 即当 84 变为 80 读出来的会是 -128
       是其它数据时都是正确的!
======================
真的不解呀! 想死人了要!!!是不是 Corel Script 的 ASC 函数有问题不然QBASIC的程序怎么就没错呢!

0AEF:0110  00 00 72 02 00 00 >>84 00-00 00<< 01 00 01 00 00 00   ..r.............

Function GetDec(Byval Char As String) AS Long
    Dim index        AS Long
    Dim  temp        AS String
    Dim  str_temp    AS String
    
    For index = Len(Char) To 1 Step -1
        temp = Cstr(ASC(Mid(Char, index, 1)))
        If Len(temp) > 1 And Left(temp, 1) = "-" Then
            temp = Mid(temp, 2, Len(temp))
        End If
        str_temp = str_temp & Hex(Clng(Temp))
    Next            
    GetDec = Dec(str_temp)
End Function

12 楼

GetHex$ 这个转换函数没有必要自己写,有现成的可以用

16进制转10进制
PRINT VAL("&hFF")

字符转数值
cvi 2个字符
CVL 4个字符
CVD 8个字符

数值转字符
CHR$ 一个字节
MKI$ 2个字节
MKL$ 4个字节
MKd$ 8个字节

OPEN "D:\Theaa.bmp" FOR INPUT AS #1
    SEEK 1, &H1
    BMP = INPUT$(2, 1)
你在这里用INPUT的方式打开不是很好
可以这样
OPEN "D:\Theaa.bmp" FOR binary AS #1
get #1,1,a%

13 楼

[em12]本想告你一个答非所问的罪名!不过见你这几个函数是很绝的!!我重没有见到别人用过!  所以.... 呵呵!

我来回复

您尚未登录,请登录后再回复。点此登录或注册