找回密码
 点一下
查看: 3889|回复: 3

IdToString&StringToId

[复制链接]
发表于 2006-4-21 07:19:10 | 显示全部楼层 |阅读模式
测试时很好用的东东,将String形式的比如用PlayerChatEvent输入的字符换算成整数格式方便动态添加单位,技能等.
原理和麦德原来作StringToId相识似..不过来自暴雪本身的DebugIdInteger2IdString.(cheat.j,藏在WAR3.MPQ里)居然有错..汗,主要是里面用的字典都错了一位,因为这个问题我弄了好半天,(我用暴雪原装的DebugIdInteger2IdString去检查,谁想得到是blizzard自己的毛病.)

[codes=jass]//===========================================================================
// Convert a integer id value into a 4-letter id code.
//
function DebugIdInteger2IdString takes integer value returns string
    local string charMap = "..................................!.#$%&'()*+,-./0123456789:;<=>.@ABCDEFGHIJKLMNOPQRSTUVWXYZ[.]^_`abcdefghijklmnopqrstuvwxyz{|}~................................................................................................................................"
    local string result = ""
    local integer remainingValue = value
    local integer charValue
    local integer byteno

    set byteno = 0
    loop
        set charValue = ModuloInteger(remainingValue, 256)
        set remainingValue = remainingValue / 256
        set result = SubString(charMap, charValue, charValue + 1) + result

        set byteno = byteno + 1
        exitwhen byteno == 4
    endloop
    return result
endfunction[/codes]
修正一个点的位置.能用了..
下面是我写的:
[codes=jass]function debugS2I takes string targetstr returns integer
local string originstr="..................................!.#$%&'()*+,-./0123456789:;<=>.@ABCDEFGHIJKLMNOPQRSTUVWXYZ[.]^_`abcdefghijklmnopqrstuvwxyz{|}~................................................................................................................................"
local integer strlength=StringLength(targetstr)
local integer a=0            //分部当前数字
local integer b=0          //当前处理字  
local integer numx=1    //位权
local integer result=0
loop
exitwhen b>strlength-1
    set numx=R2I(Pow(256,strlength-1-b))
    set a=1
    loop
    exitwhen a>255
    if SubString(targetstr,b,b+1)==SubString(originstr,a,a+1) then
    set result=result+a*numx
    set a=256
    endif
    set a=a+1
    endloop
    set b=b+1
endloop
return result
endfunction
[/codes]

[ 本帖最后由 kook 于 2006-4-21 20:46 编辑 ]
发表于 2006-4-21 13:42:32 | 显示全部楼层
原帖由 kook 于 2006-4-21 07:19 发表
主要是里面用的字典都错了一位


%的问题


http://bbs.ourga.com/viewthread.php?tid=498
Jass中已知的 bugs

11. 保存地图时一个%符号会从自定义代码区里消失
这只发生在自定义代码区(地图开头写公用函数那里)
解决的办法 写两个%% 这样一个被移走了 还剩下你需要的那个
回复

使用道具 举报

匿名
匿名  发表于 2007-12-14 11:56:37
[codes=jass]
// Asc Strings
globals
    string chars="0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\\\]^-`abcdefghijklmnopqrstuvwxyz"
    integer CharHead=0
endglobals

function InitAsc takes nothing returns nothing
   local integer U_Integer=0
   local string  U_String="0"

   local integer i=0
   local string char
   set   CharHead=U_Integer
   loop
        exitwhen i>122-48
        set char=SubString(chars,i,i+1)
        set i=i+1
   endloop
endfunction
function Char2Int takes string char returns integer
    local integer U_Integer=0
    local string  U_String=char
    return U_Integer-CharHead+48
endfunction
function ASC2I takes string arg returns integer
   local integer length=StringLength(arg)
   local integer index=0
   local integer value=0
   loop
    exitwhen index==length
       exitwhen index>4
    set value=value*256+Char2Int(SubString(arg,index,index+1))
    set index=index+1
   endloop
   return value
endfunction
[/codes]
回复

使用道具 举报

匿名
匿名  发表于 2007-12-14 12:00:57
在地图初使化时,调用InitAsc
如果只想得到一个字母的ASC值,调用Char2Int就可以了(只有3行代码的转换函数)
如果想得到一个字符的ASC值,要多写几行.

说明:
(连续生成的字符串是连续存储的,依次生成0---9,  A---Z,a---z就可以了)
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 点一下

本版积分规则

Archiver|移动端|小黑屋|地精研究院

GMT+8, 2024-11-22 03:19 , Processed in 0.891479 second(s), 19 queries .

Powered by Discuz! X3.5

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表