Android 常量无符号字符*与字符串或常量字符的转换*

Android 常量无符号字符*与字符串或常量字符的转换*,android,c++,pointers,casting,malloc,Android,C++,Pointers,Casting,Malloc,我迷失在指针的地狱里!这是我的问题 这是非常奇怪的,我只能控制一个功能,所以请不要说我需要重新设计。 这是在Linux Ubuntu11.04中使用android-ndkr7编译的。它是一个纯本地应用程序(或服务),将在android手机上运行。我正在使用谷歌测试来验证我的类/函数。 第一个函数(我的测试类)必须声明unsigned char*,它将其传递给第二个函数作为输出(crypt::encryptBuffer),encrypt接受声明的变量,为其分配内存,并将其传递给第三个函数,该函数将

我迷失在指针的地狱里!这是我的问题

这是非常奇怪的,我只能控制一个功能,所以请不要说我需要重新设计。 这是在Linux Ubuntu11.04中使用android-ndkr7编译的。它是一个纯本地应用程序(或服务),将在android手机上运行。我正在使用谷歌测试来验证我的类/函数。 第一个函数(我的测试类)必须声明unsigned char*,它将其传递给第二个函数作为输出(crypt::encryptBuffer),encrypt接受声明的变量,为其分配内存,并将其传递给第三个函数,该函数将值作为输出放入其中

地穴

class Crypt
{
public:

   Crypt();
   ~Crypt();

   bool encryptBuffer(const unsigned char* inDecryptBuffer, const int inputSize, unsigned char** outEncryptBuffer, int*  pOutSize);

};

#endif
Crypt.cpp

#include "Crypt.h"
#include "pan/crypt.h"

static unsigned char HydraEncryptionKey[] = {0x17, 0x43, 0x9B, 0x55, 0x07, 0xAE, 0x73, 0xB1, 0x32, 0x10, 0xE0, 0x22, 0xD9, 0xC7, 0xF2, 0x3B};

bool AccCrypt::encryptBuffer(const unsigned char* inDecryptBuffer, const int inputSize, unsigned char** outEncryptBuffer, int*  pOutSize)
{
    int encryptedSize;
    pan::aes128_cbc enc(HydraEncryptionKey);

    // see how long the encrypted data will be and allocate space for the data
    encryptedSize = enc.output_len( inputSize );

    *outEncryptBuffer = (unsigned char*)malloc(encryptedSize + 4);

    enc.encrypt(inDecryptBuffer, *outEncryptBuffer, inputSize );
    return true;
}
密码测试

#incude "Crypt.h"
#include <gtest/gtest.h>

#define CHECK_COND(X, a, b, c) { \
if(X) \
{ \
    printf("FAIL: %s\n", c); \
    printf("Press any key to continue");\
    getc(stdin);\
}\
else \
{ \
    printf("PASS: %s\n", c); \
}\
}

#define EXPECT_EQ(a,b,c)  CHECK_COND((a != b), a, b, c)

const char* decBuff = "something";
const int inputSize = 10;
unsigned char* encBuffTest = NULL;
int pOutsize = 0;

class cryptTester : public testing::Test
{
    protected:
    virtual void SetUp()
    {
        cryptTest = new Crypt();
        cryptTest->encryptBuffer((const unsigned char*)decBuff, inputSize, &encBuffTest, &pOutsize);
    }

    virtual void TearDown()
    {
    }

    Crypt* cryptTest;

};
TEST_F(AccCryptTest, decryptBuffer)
{
    int poutSize = 0;
    EXPECT_EQ(true, accCryptTest->decryptBuffer((const unsigned char*)encBuffTest, pOutsize, &outDecryptBuffTest, &poutSize), "decryptBuffer(valid, valid)");

}
#包括“Crypt.h”
#包括
#定义检查条件(X,a,b,c){\
if(X)\
{ \
printf(“失败:%s\n”,c)\
printf(“按任意键继续”)\
getc(stdin)\
}\
否则\
{ \
printf(“通过:%s\n”,c)\
}\
}
#定义期望等式(a,b,c)检查条件((a!=b),a,b,c)
const char*decBuff=“某物”;
常量int inputSize=10;
无符号字符*encBuffTest=NULL;
int pOutsize=0;
类cryptTester:公共测试::测试
{
受保护的:
虚拟空间设置()
{
cryptest=新Crypt();
cryptTest->encryptBuffer((const unsigned char*)decBuff、inputSize、&encBuffTest、&pOutsize);
}
虚拟void拆卸()
{
}
密码*密码测试;
};
测试F(AccCryptTest,decryptBuffer)
{
int poutSize=0;
EXPECT_EQ(true,accryptTest->decryptBuffer((const unsigned char*)encBuffTest,pOutsize,&outDecryptBuffTest,&pOutsize),“decryptBuffer(valid,valid)”;
}
这将很好地编译,但是当我在手机上运行它时,我得到了一个分段错误。我无法确定这是在哪里发生的,因为我无法从adb shell正确设置调试


任何帮助都将不胜感激

您的代码似乎正常,可能错误在
加密方法中:

enc.encrypt(inDecryptBuffer, *outEncryptBuffer, inputSize );

您应该能够在一个完全受支持的开发环境(例如在gdb中运行本机代码,或者在桌面上而不是手机上运行您最喜欢的其他调试器)中舒适地调试它。一旦你发现了这个问题,在Android的NDK下编译时应该不会有什么不同。无论失败与否,都与unsigned char vs.char无关。这是显而易见的,但我建议在分配内存(malloc)和创建对象(new)后测试指针。-1不是真正的代码<代码>密码测试=新密码()
其中
cryptest
是一个类名,不应编译。浪费了人们的时间。干杯阿尔夫,你说得对,这不是我真正的密码。由于法律原因,我不能把真正的代码放在这里,所以我不得不很快改变名称。我还不得不去掉很多东西。但是,如果阅读代码前后的注释,您将看到Crypt是类的名称,cryptest是google测试函数中使用的实例化的名称。它在虚拟void setup()之外声明。因此,是的,它将编译。不要成为一个憎恨者。