2010-12-29 3 views

ответ

3

No. Диапазон string.byte() должен быть 0..255 включительно; документация не указывается, но исходный код понятен:

static int str_byte (lua_State *L) { 
    size_t l; 
    const char *s = luaL_checklstring(L, 1, &l); 
    ptrdiff_t posi = posrelat(luaL_optinteger(L, 2, 1), l); 
    ptrdiff_t pose = posrelat(luaL_optinteger(L, 3, posi), l); 
    int n, i; 
    if (posi <= 0) posi = 1; 
    if ((size_t)pose > l) pose = l; 
    if (posi > pose) return 0; /* empty interval; return no values */ 
    n = (int)(pose - posi + 1); 
    if (posi + n <= pose) /* overflow? */ 
    luaL_error(L, "string slice too long"); 
    luaL_checkstack(L, n, "string slice too long"); 
    for (i=0; i<n; i++) 
    lua_pushinteger(L, uchar(s[posi+i-1])); 
    return n; 
} 

из lua-5.1.4/src/strlib.c, (C) 1994-2008 Lua.org; по лицензии BSD

Важной линией является вызов lua_pushinteger, который используется для возврата целочисленного значения вызывающей функции и uchar, который принуждает значение к одному в диапазоне от 0..255.

+0

Любой ссылку или DOCO на что подтвердить? Я верю, что это объяснит ошибку, которую я вижу. Однако я хотел бы что-то сказать. – rfeak

+0

Документация гордится своей плотностью; Я вставлю исходный код для str_byte, где вы можете увидеть, что он преобразуется в uchar, а затем в целое число до возврата значения. – swdunlop

+0

Это именно то, что мне нужно. Спасибо! – rfeak

0

, если у Вас возникли вопросы относительно Lua внутренней работы, его всегда легче всего проверить источник: http://www.lua.org/source/5.1/lstrlib.c.html#str_byte (и да, я понимаю, что понимание этого требует немного работы;))

Смежные вопросы