找回密码
 点一下
查看: 2592|回复: 15

求16进制转256进制的方法

[复制链接]
发表于 2014-12-11 03:36:41 | 显示全部楼层 |阅读模式
本帖最后由 RoyalFlare 于 2014-12-11 03:42 编辑

迫不得已只好发帖 已经在论坛里搜索过了 只有2进制 10进制 36进制转换为256进制的教程 就是没有如何转化16进制数值的方法 详细希望 非常感谢!


不管什么进制都是一样的啊,比如256进制就是
个位数*256^0 + 十位数*256*1 + 百位数*256*2 + ....
只不过256进制里是用每个位数上的字符的ASCII对应数字来计算的,比如A是65

@chyj4747 你能提供N进制的转换公式 但是如果我需要批量处理技能ID呢? 能否提供1个演示地图或者Jass代码?

可以用WE进行转换
call BJDebugMsg(I2S( 'A001' ))
用自定义代码,A001为要显示的ID

@希瓦 这样转化出来的是10进制数据 我不需要这个
已经翻阅相关教程地址如下 都没有谈到16进制的
http://bbs.islga.org/forum.php?mod=viewthread&tid=7224
http://bbs.islga.org/forum.php?mod=viewthread&tid=37970
http://bbs.islga.org/forum.php?mod=viewthread&tid=25693
http://bbs.islga.org/forum.php?mod=viewthread&tid=35093
http://bbs.islga.org/forum.php?mod=viewthread&tid=18470
http://bbs.islga.org/forum.php?mod=viewthread&tid=12151

@chyj4747 @ckpig @希瓦 @lo
 楼主| 发表于 2014-12-11 03:39:56 | 显示全部楼层

  1. function Trig_B63T_Conditions takes nothing returns boolean
  2.     if(not(GetSpellAbilityId()==0x414E7266))then
  3.         return false
  4.     endif
  5.     return true
  6. endfunction
  7. function Trig_B63T_Func006C takes nothing returns boolean
  8.     if(not(GetHeroStatBJ(bj_HEROSTAT_INT,GetTriggerUnit(),true)>=60))then
  9.         return false
  10.     endif
  11.     return true
  12. endfunction
  13. function Trig_B63T_Func008Func001C takes nothing returns boolean
  14.     if(not(IsUnitAlly(GetEnumUnit(),GetOwningPlayer(GetTriggerUnit()))==false))then
  15.         return false
  16.     endif
  17.     if(not(GetOwningPlayer(GetEnumUnit())!=Player(15)))then
  18.         return false
  19.     endif
  20.     if(not(IsUnitType(GetEnumUnit(),UNIT_TYPE_STRUCTURE)==false))then
  21.         return false
  22.     endif
  23.     if(not(IsUnitAliveBJ(GetEnumUnit())==true))then
  24.         return false
  25.     endif
  26.     return true
  27. endfunction
  28. function Trig_B63T_Func008A takes nothing returns nothing
  29.     if(Trig_B63T_Func008Func001C())then
  30.         call UnitDamageTargetBJ(GetTriggerUnit(),GetEnumUnit(),((GetUnitStateSwap(UNIT_STATE_MAX_MANA,GetEnumUnit())-GetUnitStateSwap(UNIT_STATE_MANA,GetEnumUnit()))*((.2*I2R(GetUnitAbilityLevelSwapped(0x414E7266,GetTriggerUnit())))+.5)),ATTACK_TYPE_NORMAL,DAMAGE_TYPE_COLD)
  31.         call SetUnitFacingToFaceUnitTimed(GetLastCreatedUnit(),GetEnumUnit(),0)
  32.         call IssueTargetOrder(GetLastCreatedUnit(),"entanglingroots",GetEnumUnit())
  33.     else
  34.     endif
  35. endfunction
  36. function Trig_B63T_Actions takes nothing returns nothing
  37.     set udg_TempPoint=GetSpellTargetLoc()
  38.     call CreateNUnitsAtLoc(1,0x68303148,GetOwningPlayer(GetTriggerUnit()),udg_TempPoint,bj_UNIT_FACING)
  39.     call UnitApplyTimedLifeBJ(6.,0x42544C46,GetLastCreatedUnit())
  40.     call ShowUnitHide(GetLastCreatedUnit())
  41.     call UnitAddAbilityBJ(0x41304843,GetLastCreatedUnit())
  42.     if(Trig_B63T_Func006C())then
  43.         call SetUnitAbilityLevelSwapped(0x41304843,GetLastCreatedUnit(),((GetHeroStatBJ(bj_HEROSTAT_INT,GetTriggerUnit(),true)/60)+1))
  44.     else
  45.     endif
  46.     set bj_wantDestroyGroup=true
  47.     call ForGroupBJ(GetUnitsInRangeOfLocAll(800.00,udg_TempPoint),function Trig_B63T_Func008A)
  48.     call RemoveLocation(udg_TempPoint)
  49. endfunction
  50. function InitTrig_B63T takes nothing returns nothing
  51.     set gg_trg_B63T=CreateTrigger()
  52.     call DisableTrigger(gg_trg_B63T)
  53.     call TriggerRegisterAnyUnitEventBJ(gg_trg_B63T,EVENT_PLAYER_UNIT_SPELL_EFFECT)
  54.     call TriggerAddCondition(gg_trg_B63T,Condition(function Trig_B63T_Conditions))
  55.     call TriggerAddAction(gg_trg_B63T,function Trig_B63T_Actions)
  56. endfunction
复制代码

查找地图units目录下的txt文件后得知发动的技能ID是ANrf 其他的就不知道了=_=
回复

使用道具 举报

发表于 2014-12-11 07:41:04 | 显示全部楼层
如果你真的看懂二进制和十进制的相互转换的话,我觉得十六进制和十进制的相互转换也应该能懂吧……

首先,十进制转二进制,规则就是“除二取余,倒序排列”
比如“25”,转化为二进制:
25÷2=12……1
12÷2=6  ……0
6÷2=3    ……0
3÷2=1    ……1
1÷2=0    ……1
所以,25转为二进制就是“11001”

同理,十进制转十六进制,规则就是“除十六取余,倒序排列”
比如“5124”,转化十六进制:
5124÷16=320……4
320÷16=20    ……0
20÷16=1        ……4
1÷16=0          ……1
所以5124转化为十六进制就是“1404”

这个规则可以应用到十进制转化为任何进制,如果是十进制以外,你只需要处理好买个字符代表的数字就好

任何进制转化为十进制就不介绍了,因为太简单……

下面介绍二进制转化为十六进制:
这个是特殊方法,如果你看懂了,一些特殊进制的转化也能使用这个方法,但并非通用的。
具体方法是先将十六进制的每一个字符对应出二进制的数字,注意,二进制要保留4个数字:
十六进制 —— 二进制
1             0001
2             0010
3             0011
4             0100
5             0101
6             0110
7             0111
8             1000
9             1001
A             1010
B             1011
C             1100
D             1101
E             1110
F             1111
接下来,把要转化的二进制数,从后向前,4个数字为一组,前面不足4位的补0,然后对应上面的表,找到十六进制字符就好
比如“101001101”
二进制    0001 0100 1101
十六进制      1       4       D


回复

使用道具 举报

发表于 2014-12-11 07:44:05 | 显示全部楼层
虽然不知道你要做什么,不过这就是转化方法了,而且是标准转化方法,没有比这更好用的了……至于要怎么用触发处理,你可以改改别人的触发……
回复

使用道具 举报

发表于 2014-12-11 07:54:23 | 显示全部楼层
仔细看标题是十六转二百五十六啊……
其实方法和二进制转十六进制是一样的,不过这次是两个数字一组做出比对表,演示就没法做了,因为lo没有办法发明那么多的符号来代表256个数,嗯,就这样了,去睡回笼觉了……

点评

你就把256进制对应ASCII码 就知道了  发表于 2014-12-11 13:41
回复

使用道具 举报

发表于 2014-12-11 10:45:13 | 显示全部楼层
用10进制做下中介转换很方便啊,就是先把16进制转成10进制再转到256进制
当然如果你能直接用“0xff / 256 = 0”这种来计算的话那就直接写就行了

点评

“0xff / 256 = 0”? 虽不明但觉厉  发表于 2014-12-11 11:43
回复

使用道具 举报

发表于 2014-12-11 11:53:42 | 显示全部楼层
0xff = 255啊。。
255/256不是等于0么。。

然后我那句的意思是如果你能直接计算16进制除以256进制的话
回复

使用道具 举报

 楼主| 发表于 2014-12-11 13:25:16 | 显示全部楼层
你们能不能来点实际的? 话说下面这段代码不能转换16进制的数据 需要再修改1下
基本思路是对了 256进制其实对应ASCII码 对照着翻译就行

  1. function Dec2Ascii takes integer i returns string
  2. local string array ascii //存放ascii码的表,由于实际应用不需要特殊符号所以只要大写小写字母和数字

  3. set ascii[48] = "0"  // 从这里开始才有意义
  4. set ascii[49] = "1"
  5. set ascii[50] = "2"
  6. set ascii[51] = "3"
  7. set ascii[52] = "4"
  8. set ascii[53] = "5"
  9. set ascii[54] = "6"
  10. set ascii[55] = "7"
  11. set ascii[56] = "8"
  12. set ascii[57] = "9"

  13. //大写字母
  14. set ascii[65] = "A"
  15. set ascii[66] = "B"
  16. set ascii[67] = "C"
  17. set ascii[68] = "D"
  18. set ascii[69] = "E"
  19. set ascii[70] = "F"
  20. set ascii[71] = "G"
  21. set ascii[72] = "H"
  22. set ascii[73] = "I"
  23. set ascii[74] = "J"
  24. set ascii[75] = "K"
  25. set ascii[76] = "L"
  26. set ascii[77] = "M"
  27. set ascii[78] = "N"
  28. set ascii[79] = "O"
  29. set ascii[80] = "P"
  30. set ascii[81] = "Q"
  31. set ascii[82] = "R"
  32. set ascii[83] = "S"
  33. set ascii[84] = "T"
  34. set ascii[85] = "U"
  35. set ascii[86] = "V"
  36. set ascii[87] = "W"
  37. set ascii[88] = "X"
  38. set ascii[89] = "Y"
  39. set ascii[90] = "Z"

  40. //小写字母
  41. set ascii[97] = "a"
  42. set ascii[98] = "b"
  43. set ascii[99] = "c"
  44. set ascii[100] = "d"
  45. set ascii[101] = "e"
  46. set ascii[102] = "f"
  47. set ascii[103] = "g"
  48. set ascii[104] = "h"
  49. set ascii[105] = "i"
  50. set ascii[106] = "j"
  51. set ascii[107] = "k"
  52. set ascii[108] = "l"
  53. set ascii[109] = "m"
  54. set ascii[110] = "n"
  55. set ascii[111] = "o"
  56. set ascii[112] = "p"
  57. set ascii[113] = "q"
  58. set ascii[114] = "r"
  59. set ascii[115] = "s"
  60. set ascii[116] = "t"
  61. set ascii[117] = "u"
  62. set ascii[118] = "v"
  63. set ascii[119] = "w"
  64. set ascii[120] = "x"
  65. set ascii[121] = "y"
  66. set ascii[122] = "z"

  67. if (i < 48) or (i > 57 and i < 65) or (i > 90 and i < 97) or (i > 122) then
  68.     return "_"
  69. else
  70.     return ascii
  71. endif
  72. return "_"
  73. endfunction

  74. function I2Ascii takes integer i returns string
  75. if i < 256 then
  76.     return Dec2Ascii(i)
  77. else
  78.     return I2Ascii(i / 256) + Dec2Ascii(ModuloInteger(i,256)) //余数
  79. endif
  80. return "_"
  81. endfunction
复制代码

点评

我记得头目说过其实魔兽中实际使用到的是36进制 其他都是以"_"填充的  发表于 2014-12-11 13:26
回复

使用道具 举报

发表于 2014-12-11 15:25:59 | 显示全部楼层
都说的这么详细了,你居然还不知道么……

首先,制作一个对照表,就像你上面做的那个数组变量一样
然后判断需要转化的十六进制数的字符串个数,如果是奇数,就在最前面补一个“0”
再截取字符串,每次截取两个字符串,把截取的字符串从十六进制转化为十进制,然后用这个数从你的ASCII码的数组中找到对应字符
最后把你所得到的ASCII码的字符按照顺序连接起来就好。

点评

数学从未及格的默默路过  发表于 2014-12-12 00:25
回复

使用道具 举报

发表于 2014-12-11 15:27:17 | 显示全部楼层
lz好笨,⑨和baka树都比你聪明……
回复

使用道具 举报

发表于 2014-12-11 20:26:49 | 显示全部楼层
想写一个转换进制的工具不需要用Jass啊,用C#,C++不是更好吗。
在地图里转换进制做什么?
回复

使用道具 举报

发表于 2014-12-11 20:36:32 | 显示全部楼层
思路:先把16进制数字两个一组转换为一个10进制数,然后十进制转对应的字符就好了。
http://bbs.islga.org/forum.php?m ... 8MzcwMjF8NjA5NzM%3D
这是我以前写的存档系统,里面有个函数可以10转256,你可以参考一下。
用的是循环查找的笨方法,想要更高的效率,可以使用哈希表。
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-4-28 19:58 , Processed in 0.142072 second(s), 29 queries .

Powered by Discuz! X3.5

© 2001-2023 Discuz! Team.

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