同样文件,基于文件路径和文件内容,所计算出来的MD5值不一致。

背景是这样
在参考论坛大大的更新方案
http://www.cocoachina.com/bbs/read.php?tid=213257

(可以直接进贴搜索 crypto.md5 )

然后我再自己试验的时候,发现读取网络上下载的文件内容,生成的MD5值,
对比按照文件路径 CCCrypto:MD5File 生成MD5值是不一样的。
大神可以指点下吗?
不知道和这位兄弟的问题是不是一样的
http://www.cocoachina.com/bbs/read.php?tid=210256

 
function MyApp:_requestFromServer() 
    local url = "http://192.168.1.3/upd/framework_precompiled.zip" 
  
        local request = CCHTTPRequest:createWithUrl(function(event) 
         self:_onResponse(event) 
        end, url, kCCHTTPRequestMethodGET) 
        if request then 
         request:setTimeout( 60) 
         request:start() 
     else 
      --初始化网络错误 
      self._updateRetType = UpdateRetType.NETWORK_ERROR 
        
     end 

end 
function MyApp:_onResponse(event, requestType) 
    local request = event.request 
    if event.name == "completed" then 
       local dataRecv = request:getResponseData() 
        local md5Code = CCCrypto:MD5(dataRecv, false) 
        printf("接受成功") 
        self.writefile("scripts/test.zip",dataRecv) 
        local fileMd5Code = CCCrypto:MD5File("scripts/test.zip") 
        printf(md5Code) 
        printf(fileMd5Code) 
      end 
   
end 

function MyApp.writefile(path, content)
    local file = io.open(path,  "w+b")
    if file then
        if file:write(content) == nil then return false end
        io.close(file)
        return true
    else
        return false
    end
end

官方例子,2048里面,有个将读取到的数据处理一下的代码
结果还是不一致,难道是getResponseData 返回格式的问题?
local function hex(s)
s=string.gsub(s,"(.)",function (x) return string.format("%02X",string.byte(x)) end)
return s
end

CCCrypto:MD5这个接口,如果传入的数据带有字符0,处理时数据会被截断,所以不适用于二进制流的处理。
你存贮后用MD5File这个接口处理,得到的数据就是正常的了。
例子中在使用MD5接口之前调用hex函数,就是为了把数据转换成纯文本格式的。如果在客户端这样处理了,那在服务器端计算md5值的时候也要作对应的处理。

原来如此, 遇到 ‘\0’ 截断 .

又学习了 …

是不是需要再给一个 CCCrypto:MD5(data, size) 这样的接口以满足内存校验呢 ?

1:然后二进制流的话,该怎么处理呢?
2:现在我就是用这种方式处理,但是同样的内容,IO上读取了两次,很难受
3:虽然我不知道这种hex的实现目的,但是本来就两种情况,A:遇0截断的md5值 B:完整的md5值
为何还通过hex计算出第三种md5值。。。

如果确实需要对内存中的二进制流进行处理,又不想对二进制流做任何转换,就要如板凳所说,专门提供一个接口。目前quick还没有提供,你可以先自己添加,也不难。
之所以用hex转换,就是为了不添加接口,所以做一个变通处理。