Ir ao conteúdo
  • Cadastre-se

C++ Manipulando dados binários entre C++ e Lua


KassioACB

Posts recomendados

Eu preciso fazer um programa que irá lidar com dados binários, muitos deles.

 

Resumindo, o programa C++ carregará um arquivo binário (alguns deles excedem 20mb) em um buffer. Em seguida, ele executará um script Lua e passará todos esses dados carregados para o script, que fará alguma manipulação e retornará o resultado para o programa C++.

 

Eu preciso fazer isso ter o melhor desempenho possível e fazer o trabalho mais rápido.

 

Um tempo atrás eu já fiz esse programa usando os métodos convencionais de Lua, mas era extremamente lento. Então, perdi os arquivos e agora quero refazê-lo de uma maneira melhor e mais rápida que não comprometa o desempenho.

 

Pesquisando um pouco, encontrei isso. Tive que fazer algumas pequenas mudanças para me adaptar à nova versão do Lua, mas não consigo fazer funcionar. Vocês podem me ajudar com isso?

 

E se há uma maneira melhor de fazer o trabalho que eu disse, qual seria?

 

#include "stdafx.h"

// metatable method for handling "array[index]"
static int array_index(lua_State* L) {
    int** parray = (int**)luaL_checkudata(L, 1, "array");
    int index = luaL_checkinteger(L, 2);
    lua_pushnumber(L, (*parray)[index - 1]);
    return 1;
}

// metatable method for handle "array[index] = value"
static int array_newindex(lua_State* L) {
    int** parray = (int**)luaL_checkudata(L, 1, "array");
    int index = luaL_checkinteger(L, 2);

    int value = luaL_checkinteger(L, 3);
    (*parray)[index - 1] = value;
    return 0;
}

// create a metatable for our array type
static void create_array_type(lua_State* L) {
    static const struct luaL_Reg array[] = {
       { "__index",  array_index  },
       { "__newindex",  array_newindex  },
       NULL, NULL
    };
    luaL_newmetatable(L, "array");

    luaL_setfuncs(L, array, 0);
}

// expose an array to lua, by storing it in a userdata with the array metatable
static int expose_array(lua_State* L, int array[]) {
    int** parray = (int**)lua_newuserdata(L, sizeof(int**));
    *parray = array;
    luaL_getmetatable(L, "array");
    lua_setmetatable(L, -2);
    return 1;
}

// test data
int mydata[] = { 1, 2, 3, 4 };

// test routine which exposes our test array to Lua 
static int getarray(lua_State* L) {
    return expose_array(L, mydata);
}

int __declspec(dllexport) __cdecl luaopen_array(lua_State* L) {
    create_array_type(L);

    // make our test routine available to Lua
    lua_register(L, "array", getarray);
    return 0;
}


int main()
{
    lua_State* L = luaL_newstate();
    luaL_dostring(L, "require 'array'");
    luaL_dostring(L, "foo = array()");
    luaL_dostring(L, "x = foo[1]");
    lua_getglobal(L, "x");
    lua_Number x = lua_tonumber(L, 1);

    printf("foo[1] = %d\n", (int)x);
}

 

  • Obrigado 1
Link para o comentário
Compartilhar em outros sites

Crie uma conta ou entre para comentar

Você precisa ser um usuário para fazer um comentário

Criar uma conta

Crie uma nova conta em nossa comunidade. É fácil!

Crie uma nova conta

Entrar

Já tem uma conta? Faça o login.

Entrar agora

Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas comunidades sobre tecnologia do Brasil. Leia mais

Direitos autorais

Não permitimos a cópia ou reprodução do conteúdo do nosso site, fórum, newsletters e redes sociais, mesmo citando-se a fonte. Leia mais

×
×
  • Criar novo...

 

GRÁTIS: ebook Redes Wi-Fi – 2ª Edição

EBOOK GRÁTIS!

CLIQUE AQUI E BAIXE AGORA MESMO!