Subscribed unsubscribe Subscribe Subscribe

枕を欹てて聴く

香炉峰の雪は簾を撥げて看る

C文字列を扱う際に

Ruby C

家のADSL開通が5/5なのでstatic IPにならず(EMOBILEのCard使用), 家ではcoLinuxから外に出れなくてgitも使えないという悲惨な状況になってるのですが, 一月にひとつは何か書こうと思ったので.

Archiveiwとかがarchiveのヘッダを読む際に後ろ何文字かをカットしてる場合がある.
つまり, その一歩手前にfile nameが何文字になるか書いてあって, その分だけreadしてくるとfile nameになったりするのだけど, これの後ろ何文字かをカットしてる場合があるということです.
しかし, 本家unrarのソースを見てみると, 別にカットすることなく使用してる.

で,なんでかという話で, これをたとえばRubyで取得すると,

"/ruby/test.rb\000\000"

みたいな文字列になってる. みればわかるように, 後ろに余分なものがついてる. これをカットしてるみたいなんだけど, その文字数ってのは仕様にはないので少し危ない. 今のところ見たrarは2文字分なんかついてるけど, これが2文字と決まってるとは限らない.

ようは, これは取得してそのままCの文字列として使えるようにnull終端文字が入ってるっていう話.
でもRubyだと終端としては扱ってくれない.

これはRubyの場合は

t = "/ruby/test.rb\000\000".pack("Z*").first
p t # => "/ruby/test.rb"

ってするとnull終端文字列を削除してくれる.