查看: 5129|回复: 27

[有事请教] 这是逼着姐造一遍轮子的节奏么

[复制链接]

遠航の猫咪

梦石
3
星屑
26947
在线时间
2423 小时
注册时间
2005-10-15
回帖
987

开拓者

发表于 2017-11-21 14:32:08 | 显示全部楼层 |阅读模式

加入我们,或者,欢迎回来。

您需要 登录 才可以下载或查看,没有账号?注册会员

×
[pre lang="INI"][阿尔西斯]
profile=剑士一枚
age=28
gender=女
height=175
weight=60
is_dual_wield=false
is_hero=true
[帕吉尔]
profile=脑后有反骨的仔排
age=45
gender=男
height=192
weight=80
is_dual_wield=true
is_hero=false[/pre]
[pre lang="ruby"]  Reader = Win32API.new("kernel32", "GetPrivateProfileString", "ppppip", "i")
  value = "\0" * 65534
  Reader.call("阿尔西斯", "gender", "nil", value, 65534, NOTE_FILE_NAME)
  p value.strip![/pre]

[pre lang="ruby"]  Reader = Win32API.new("kernel32", "GetPrivateProfileStringW", "ppppip", "i")
  value = "\0" * 65534
  Reader.call("阿尔西斯", "gender", "nil", value, 65534, NOTE_FILE_NAME)
  p value.strip!
[/pre]


俩都试了,各种打出nil,nil,nil,nil,nil,nil,nil.......

点评

然而只要将[]里的内容换为英文就没有任何问题了……  发表于 2017-11-21 14:32
SailCat (小猫子·要开心一点) 共上站 24 次,发表过 11 篇文章 上 次 在: [2006年01月28日11:41:18 星期六] 从 [162.105.120.91] 到本站一游。
梦石
28
星屑
10170
在线时间
4673 小时
注册时间
2011-8-22
回帖
1216

开拓者

发表于 2017-11-21 14:36:32 | 显示全部楼层
试试GetPrivateProfileStringW?

点评

那就不太了解啦……win32api用得不多,可能在pack/unpack的时候需要什么额外处理?  发表于 2017-11-21 15:46
我的第二段代码啊……带A的带W的不带的,ini的8种文件格式,3X8=24个华丽丽的nil……  发表于 2017-11-21 14:37
回复

使用道具 举报

梦石
0
星屑
39236
在线时间
11155 小时
注册时间
2009-3-15
回帖
4768
发表于 2017-11-21 14:40:54 | 显示全部楼层
UTF8????????????

点评

默认,ansi, UTF8 有rom,无rom, UTF16有rom无rom,UTF16BE有rom无rom全试了 搭配A版W版公版全试了,全失败  发表于 2017-11-21 14:48
回复

使用道具 举报

梦石
0
星屑
35248
在线时间
4171 小时
注册时间
2007-12-15
回帖
9489
发表于 2017-11-21 15:09:48 | 显示全部楼层
听不太懂,感觉是对中文不友好,
少年……不对……中年大气有~
励志开发纯中文编程电脑系统吧XD

点评

我们计算机原理老师将汇编的时候也老这么说2333,比如说寄存器不叫AX,BX叫做甲乙丙丁,指令不是MOV,LEA叫移动,取地址,让老外蒙圈儿去XD  发表于 2017-11-21 15:34
回复

使用道具 举报

梦石
0
星屑
9292
在线时间
2504 小时
注册时间
2011-5-20
回帖
14521

开拓者

发表于 2017-11-21 15:45:11 | 显示全部楼层
···用英文啊···
感觉这有点自讨苦吃
[img]http://service.t.sina.com.cn/widget/qmd/5339802982/c02e16bd/7.png
回复

使用道具 举报

梦石
0
星屑
39236
在线时间
11155 小时
注册时间
2009-3-15
回帖
4768
发表于 2017-11-21 15:57:48 | 显示全部楼层
本帖最后由 soulsaga 于 2017-11-21 16:25 编辑

那GAME.INI是怎么读取的?
http://ytomy.sakura.ne.jp/tkool/ ... =interface_win32api
这脚本有何用?看不懂...


[pre lang="ruby"]#_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/
#_/    ◆ Win32API用インターフェース - KGC_InterfaceForWin32API ◆ XP/VX ◆
#_/    ◇ Last update : 2007/11/26 ◇
#_/----------------------------------------------------------------------------
#_/  汎用的な Win32API 用のインターフェースです。
#_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/

class Win32API
  WINDOW_CLASS = (defined?(::Cache) ? "RGSS2 Player" : "RGSS Player")
  STRING_BUF_SIZE = 255
  #--------------------------------------------------------------------------
  # ○ INIファイルを読み込む
  #     section : セクション名
  #     key     : キー
  #     default : キーが存在しない場合のデフォルト値
  #     inifile : 読み込むINIファイルのパス
  #--------------------------------------------------------------------------
  def self.GetPrivateProfileString(section, key, default, inifile)
    get_ini = Win32API.new(
      'kernel32.dll', 'GetPrivateProfileStringA', %w(p p p p l p), 'l')
    buf = "\0" * (STRING_BUF_SIZE + 1)
    get_ini.call(section, key, default, buf, STRING_BUF_SIZE, inifile)
    return buf.delete!("\0")
  end
  #--------------------------------------------------------------------------
  # ○ ウィンドウハンドルを取得
  #     window_class : ウィンドウクラス名
  #     window_title : ウィンドウのタイトル
  #--------------------------------------------------------------------------
  def self.FindWindow(window_class, window_title)
    find_window = Win32API.new('user32.dll', 'FindWindowA', %w(p p), 'l')
    return find_window.call(window_class, window_title)
  end
  #--------------------------------------------------------------------------
  # ○ アクティブウィンドウハンドルを取得
  #--------------------------------------------------------------------------
  def self.GetActiveWindow
    active_window = Win32API.new('user32.dll', 'GetActiveWindow', %w(v), 'l')
    return active_window.call
  end
  #--------------------------------------------------------------------------
  # ○ ゲーム画面のウィンドウハンドルを取得する
  #--------------------------------------------------------------------------
  def self.GetHwnd
    name = GetPrivateProfileString("Game", "Title", "", "./Game.ini")
    return FindWindow(WINDOW_CLASS, name)
  end
end
[/pre]


点评

game.ini里没有中文  发表于 2017-11-21 19:48
回复

使用道具 举报

梦石
0
星屑
13562
在线时间
2753 小时
注册时间
2014-10-4
回帖
705

R考场第七期纪念奖

发表于 2017-11-21 16:43:35 | 显示全部楼层
本帖最后由 SixRC 于 2017-11-21 16:46 编辑

试了一下 终于成功了
GetPrivateProfileStringA 或者 W
A的话 阿尔西斯需要转码成 ANSI ini 路径也是
就能成功获取gender 不过得到的是 ANSI 需要自己转回去
W的话 就都得用 Unicode UTF-8不行
不清楚内部的机制 查找 阿尔西斯 这串字符的时候 大概有什么出入
必须得全用 ANSI 或者 Unicode 吧
成功的代码
[pre lang="ruby"]WideCharToMultiByte=Win32API.new('kernel32','WideCharToMultiByte','llplplll','l')
MultiByteToWideChar=Win32API.new('kernel32','MultiByteToWideChar','llplpl','l')
def utf8_to_uni(str)
  len=MultiByteToWideChar.call(0xFDE9,0,str,-1,0,0)
  str2="\0"*len
  MultiByteToWideChar.call(0xFDE9,0,str,-1,str2,len)
  str2
end
Reader = Win32API.new("kernel32", "GetPrivateProfileStringW", "ppppip", "i")
value = "\0" * 65534
aa="阿尔西斯"
aa=utf8_to_uni("阿尔西斯")
k= "gender"
k=utf8_to_uni(k)
ini=Dir.pwd+"/a.ini"
ini=utf8_to_uni(ini)
Reader.call(aa, k, "nil", value, 65534, ini)
p value.strip![/pre]

记得把 ini 保存成 Unicode
哪个方便用哪个吧

点评

把轮子里的eval去掉后直接返回字符串的结果是……10000次0.42s……API法的价值已经不大了  发表于 2017-11-21 20:21
测试完了,用API的方法快33%左右(10000次0.4s vs 0.6s),但是经常运行出内存访问错误(十回运行得三四回内存错误),估计靠谱的还是得优化轮子……  发表于 2017-11-21 20:17
多谢,但是读一个字符串就要调三个API,我需要考虑调用代价的事了……一会评估一下速度去  发表于 2017-11-21 19:48

评分

参与人数 1赞 +1 收起 理由
SailCat + 1 我很赞同

查看全部评分

回复

使用道具 举报

遠航の猫咪

梦石
3
星屑
26947
在线时间
2423 小时
注册时间
2005-10-15
回帖
987

开拓者

 楼主| 发表于 2017-11-21 19:38:20 | 显示全部楼层
然而我已经造了轮子……
一会评估一下大量的检索哪个比较快吧
[pre lang="ruby"]  def self.read_ini(section, parameter, default, filename)
    begin
      File.open(filename) do |f|
        ks = "[#{section}]\n"
        kp = parameter + "="
        flag = false
        f.each_line do |l|
          next unless l == ks or flag
          flag = (l == ks or l[0] != "[")
          next unless l[0...kp.length] == kp
          return (eval(l[kp.length..-2]) rescue l[kp.length..-2])
        end
      end
    rescue
    end
    return default
  end
[/pre]

SailCat (小猫子·要开心一点) 共上站 24 次,发表过 11 篇文章 上 次 在: [2006年01月28日11:41:18 星期六] 从 [162.105.120.91] 到本站一游。
回复

使用道具 举报

梦石
0
星屑
13562
在线时间
2753 小时
注册时间
2014-10-4
回帖
705

R考场第七期纪念奖

发表于 2017-11-21 21:03:57 | 显示全部楼层
内存错误的原因在 utf8_to_uni 的第 5 行
原因是那个 len 返回值是宽字符的字数 申请空间不能是一去乘..我的疏忽
再乘个四就不会出错了

说到方法 当然是哪个方便易维护用哪个啦
读取 ini 一点效率大概是不用计较的了 大量数据不如自定义格式
用着舒服为准吧
回复

使用道具 举报

梦石
0
星屑
4623
在线时间
1207 小时
注册时间
2016-4-7
回帖
944

开拓者

发表于 2017-11-22 00:21:32 | 显示全部楼层
所以为啥不用json/xml呢
滑稽.jpg

点评

标准库里自然有 不过rm里就不要想了 全被阉割掉了 不过这种都有人写过现成的脚本  发表于 2017-11-22 14:49
ruby有内建的json/xml reader? ini的轮子够方便了……  发表于 2017-11-22 00:43
附庸的附庸不是我的附庸,女儿的女儿还是我的女儿。CK2沉迷ing
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册会员

本版积分规则

Powered by Discuz! X5.0 © 2001-2026 Discuz! Team.

在本版发帖返回顶部