lua_pushlstring压入栈的数据出错

我使用crypto.encryptXXTEA对数据加密之后返回的值出错,原来的数据长度300+字节,返回来的只有一个值0x39,debug了一下,c++那边加密没问题,加密出来的数据一经过lua_pushlstring就全没了,再往深查就查不出来了,lua的api跟不进去,哪位大大帮忙看看。有大大知道跟进lua api的方法么?
以下是我加密之后c++得到的数据部分截取

0x0845B6E0 d3 b5 51 12 5b d3 d9 6e 0f 64 ee 49 8d aa ??Q.??n.d?I??
0x0845B6EE 02 37 74 1d 0c 96 df b1 a5 05 8d 90 40 83 .7t…???.??@?
0x0845B6FC c5 d3 b6 c5 aa cc 8a 49 16 54 72 bf 83 c1 ???I.Tr???
0x0845B70A 6f 9e cd eb 12 4f a3 44 b2 a7 78 51 98 81 o???.O?D??xQ??
0x0845B718 f3 58 b9 93 a8 37 66 b4 d4 38 ae 30 f8 7c ?X???7f??8?0?|
0x0845B726 d6 13 ef 0c ae 81 24 d8 b7 e4 27 cd c8 97 ?.?.??$???’???
0x0845B734 a3 59 4c dc 91 7a 8e 8b 4c dd 44 3b fa a4 ?YL??z??L?D;??
0x0845B742 11 2a 03 67 6c a3 89 c9 d7 0a 4b df 01 8f .*.gl???.K?.?
0x0845B750 98 a1 7e b6 51 75 de f2 30 b3 c0 84 6c 33 ??~?Qu??0???l3
0x0845B75E f7 7c 50 27 3c af e1 b7 ce fd 9e c0 a7 93 ?|P’<???

看错了,你是调用的接口,我再看看代码

你用的是哪个版本啊?

quick2.2.5

没看出有问题啊。你在lua端是怎么调用的?

一般情况下的调用是没问题的,但是这段数据就有问题,完全不知道为什么。所以我想知道lua的api内部是怎么执行的,能否debug跟进。

local _des = crypto.encryptXXTEA(_src, XXTEA_KEY)
XXTEA_KEY是由9个数字组成的字符串

_des的结果不对吗?长度是多少?
lua的api在库里面了,没法跟进的。这个api肯定不会错的,连这么简单的api都有问题的话,恐怕没人会再用lua了,呵呵。

_des长度是1就一个字节0x39,c++那边加密完了就是我上面列出来的内存数据

以前加密其他的字符串都没啥问题~~~,不知道这个数据怎么了

不会有这种事情吧?你在lua_pushlstring之前打印一下要push的长度,在lua接收后也打印一下字串长度,把代码和调试信息发出来看看?

c ++ encryptXXTEA result : length { 308 }, content { ?Q??nd?I??7t???@???ū?ITr???o???O?D??xQ???X???7f??8?0?|?????'???YL?z??L?D;??*gl???? K????~?Qu??0???l3?|P'<????????ld?D??u???P?,???Z2U??@?1?7
|?(q???f?8??L?d!?Z??|极?X2>??
???~???i??(?P@S|???D???(???~,??a`iG8DA?C??w??p??.Cb??
/l??DC???F?1???a?M?W???UC }
===========lua encryptXXTEA : length { 1 }, hex content {39}

输出这些调试信息的代码看一下呢

c++

int resultLength;
unsigned char* result = encryptXXTEA((unsigned char*)plaintext, plaintextLength, (unsigned char*)key, keyLength, &resultLength);

CCLOG(“c ++ encryptXXTEA result : length { %d }, content { %s }”, resultLength, result);

lua:

_des = crypto.encryptXXTEA(_src, XXTEA_KEY)
Log(“lua encryptXXTEA : length { %d }, hex content {%s}”, string.len(_value), bin2hex(_des))

其中bin2hex
function bin2hex(bin)
local t = {}
for i = 1, string.len(bin) do
local c = string.byte(bin, i, i)
t#t + 1] = string.format("%02x", c)
end
return table.concat(t, " ")
end

function Log(info, …)
if LOG_LEVEL == 1 then
–CCLuaLog(…)
printLog(“INFO”, “===========” … info, …)
end
end

接收的变量不是_des吗?为什么打印的是string.len(_value)?

哦,sorry,我改错了,是
Log(“lua encryptXXTEA : length { %d }, hex content {%s}”, string.len(_des), bin2hex(_des))

木有大大可以解决这个问题么?~~~~:6:

我是在coroutine.resume里调用了这个加密方法,之后出的问题,在外面任何地方调用都木问题。
这个是不是和coroutine有关呀

如果是把加密的结果马上拿来用也不会有问题啊。难道你加密后没有马上使用,而是在其他协同函数里面用?

我马上就保存了,而且log输出是紧跟在加密之后就调用了的。
应该是和coroutine的实现机制有关吧~~~,
http://timyang.blog.51cto.com/1539170/307675

lua_pushlstring(stack->getLuaState(), (const char*)result, resultLength);在coroutine.resume里调用问题吧,这只是我的一点猜测~~~

没理由…我还是觉得你在什么地方搞错了。lua_pushlstring是最简单最基础的接口了,从实现复杂度来说真不可能出错,而且就算真的有问题也不可能到现在才发现的。