找回密码
 点一下
查看: 6378|回复: 19

十进制转六十二进制

[复制链接]
发表于 2006-4-12 15:43:16 | 显示全部楼层 |阅读模式
正在做将人物信息转换为代码的人物储存系统,想出要压缩数值,
因此弄了个十进制转六十二进制……
输入十进制数返回六十二进制字符串。

这个函数只提供下思路而已,如果将62改为其他数值还可以有102进制、200进制……

[jass]
function Ten2Code takes integer ten returns string
    local integer index = 1
    local integer array g
    local string array gs
    local string gs62
    local string Code = "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"
    if ten < 62 then
        return SubStringBJ(Code, ten+1, ten+1)
    endif
   
    loop
        exitwhen ten < 62
        set g[index] = ModuloInteger(ten,62)
        set gs[index] = SubStringBJ(Code, g[index]+1, g[index]+1)
        set ten = ten/62
        set gs[index+1] = I2S(ten)
        set index = index + 1
    endloop
    set gs62 = gs[index+1]
    loop
        exitwhen index == 0
        set gs62 = gs62 + gs[index]
        set index = index - 1
    endloop
    return gs62
    //return
endfunction
[/jass]
以下是演示地图,输入十进制数返回六十二进制字符串。

[ 本帖最后由 蚊子叮 于 2006-4-12 16:02 编辑 ]
 楼主| 发表于 2006-4-12 16:03:21 | 显示全部楼层
奇怪,怎么不会高亮呢?
回复

使用道具 举报

发表于 2006-4-12 16:03:58 | 显示全部楼层
呃?不知道。
原来是可以高亮了的啊。。
回复

使用道具 举报

发表于 2006-4-12 16:43:18 | 显示全部楼层
暂时被取消掉老应该恩
回复

使用道具 举报

发表于 2006-4-12 18:33:00 | 显示全部楼层
这个函数有个小Bug:当输入负数时,会返回空串
回复

使用道具 举报

发表于 2006-4-12 18:39:23 | 显示全部楼层
字符串可以直接连接的,这样效率高一点

以下是我写的任意进制转换(2~36)

string彻底研究V1.17。现在终于可以方便的按字符处理字符串了
http://bbs.ourga.com/viewthread.php?tid=449
[jass]
// 任意进制转换
function ConvRadix takes integer v, integer iRadix returns string
    local string chSample = \"0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ\"
    local integer cbSample = StringLength(chSample)
    local string sRet = \"\"
    local boolean bSign = false //是否是负数
    local integer n // 商
    local integer m // 余数
   
    // Check Radix
    if (iRadix < 2) and (iRadix > cbSample) then
        return \"\"
    endif
   
    // Check -2147483648
    if 0x80000000 == v then
        return \"\"
    endif
   
    // 处理符号位
    if v < 0 then
        set v = - v
        set bSign = true
    endif
   
    // Main
    loop
        // 运算
        set n = v / iRadix
        set m = v - n * iRadix
        set v = n
        // 连接字符串
        set sRet = SubString(chSample, m, m + 1) + sRet
        exitwhen 0 == v
    endloop
    if bSign then
        set sRet = \"-\" + sRet
    endif
   
    return sRet
endfunction

// 任意进制转换(定长版)
function ConvRadixN takes integer v, integer iRadix, integer iCount returns string
    local string s = ConvRadix(v, iRadix)
    local integer m
   
    set m = StringLength(s)
    if m <= 0 then
    elseif m < iCount then
        if \"-\" != SubString(s, 0, 1) then
            set s = StrDup(\"0\", iCount - m) + s
        else
            set s = SubString(s, 0, 1) + StrDup(\"0\", iCount - m + 1) + SubString(s, 1, m)
        endif
    endif
   
    return s
endfunction

// 将任意进制字符串转为整数
function DecodeRadix takes string s, integer iRadix returns integer
    local string  chSample = \"0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ\"
    local integer cbSample = StringLength(chSample)
    local string  sSrc = StrTrim(StringCase(s, true), \" \\t\", true, false)
    local integer cbSrc = StringLength(sSrc)
    local integer iRet = 0
    local string  byCur
    local boolean bSign = false
    local integer m = 0
    local integer I
    local integer J
   
    // Check Radix
    if (iRadix < 2) and (iRadix > cbSample) then
        return 0
    endif
   
    // Main
    set I = 0
    loop
        exitwhen I >= cbSrc
        //
        set byCur = SubString(sSrc, I, I + 1)
        set J = 0
        loop
            exitwhen J >= iRadix
            //
            exitwhen SubString(chSample, J, J + 1) == byCur
            //
            set J = J + 1
        endloop
        if J < iRadix then
            set m = iRet * iRadix + J
            exitwhen m < 0 // Overflow
            set iRet = m
        else
            if (false == bSign) and (\"-\" == byCur) then
                set bSign = true
            else
                exitwhen true
            endif
        endif
        //
        set I = I + 1
    endloop
    if bSign then
        set iRet = -iRet
    endif
   
    return iRet
endfunction
[/jass]
回复

使用道具 举报

发表于 2006-4-12 19:03:06 | 显示全部楼层
官方256进制转换函数

[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[/jass]
回复

使用道具 举报

 楼主| 发表于 2006-4-12 19:41:12 | 显示全部楼层
原帖由 zyl910 于 2006-4-12 18:33 发表
这个函数有个小Bug:当输入负数时,会返回空串


的确有这个问题……但是在储存中不会有负数。
另外MB下你的任意进制转换的函数。
回复

使用道具 举报

 楼主| 发表于 2006-4-12 19:43:00 | 显示全部楼层
原帖由 麦德三世B 于 2006-4-12 19:03 发表
官方256进制转换函数

[jass]//===========================================================================
// Convert a integer id value into a 4-letter id code.
//
function DebugIdInteger2IdStr ...


这个BT归BT,可能在游戏中会有些字符串显示成乱码……
回复

使用道具 举报

发表于 2006-4-12 21:18:25 | 显示全部楼层
62进制,全32位数据大概用6个字符就行了


曾经想过使用Base64编码来生成字符串
但是后来考虑到用户习惯不区分大小写
所以现在觉得使用十六进制字符串最好。全32位数据只需要8个字符
回复

使用道具 举报

发表于 2006-4-12 23:12:10 | 显示全部楼层
个人认为。小字容易和数字混在一起。
0和O也容易混。所以如果是密码的话。还是不要有0或O出现为好。
回复

使用道具 举报

发表于 2006-4-13 03:45:20 | 显示全部楼层
高亮显示已经恢复了
回复

使用道具 举报

发表于 2006-4-13 14:11:44 | 显示全部楼层
今日在mop挖坟,突然看到一篇文章:

http://bbs.game.mop.com/viewthread.php?tid=1133070
【已解决】有关中文存档系统(挑战1000进制存档)



个人觉得用《千字文》作为字符样本最好,符合中国传统文化

用三个中文字符就能存储 0~10亿 之间的数值
回复

使用道具 举报

发表于 2006-4-13 18:30:32 | 显示全部楼层
晕,要那么多干什么?好BT
回复

使用道具 举报

DeadFish 该用户已被删除
发表于 2006-4-15 13:02:20 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽
回复

使用道具 举报

发表于 2006-4-15 13:35:19 | 显示全部楼层
光有 10to62是不够的,还要62to10的函数配套
回复

使用道具 举报

发表于 2006-4-16 00:05:50 | 显示全部楼层
俺也写过,大同小异
此帖长度不足,罚5分
回复

使用道具 举报

wawawawa 该用户已被删除
发表于 2006-4-16 15:38:01 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽
回复

使用道具 举报

wawawawa 该用户已被删除
发表于 2006-4-16 15:38:08 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽
回复

使用道具 举报

wawawawa 该用户已被删除
发表于 2006-4-16 15:38:16 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-12-22 12:16 , Processed in 0.080447 second(s), 20 queries .

Powered by Discuz! X3.5

© 2001-2023 Discuz! Team.

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