java

バイナリの文字列表現(ucs-2)をバイナリに変換  [perl]  [java]

言語によっていろいろ違うなぁと実感。

Perl

use Encode;

binmode STDOUT, ":encoding(shiftjis)"; 

my @str = qw(00110000 01000010);
my $final = join('',map{pack('B8',$_)} @str);
$final = decode('UTF-16BE',$final); 
print $final;

Perlのmap関数の使い勝手は最強ですね。

java

import java.io.*; 

public class BinaryDecode{
  public static void main(String[] args) {
    String[] strArray = {"00110000","01000010"};
    byte[] bytes = new byte[2];
    int i = 0;
    for(String s : strArray){
      int j = Integer.parseInt(s,2);
      if(j > 127){ j = j - 256;} //-128~127に収める処理
      bytes[i++] = (byte)j;
    }
    try{
      System.out.println(new String(bytes,"UTF-16BE"));
    }catch(IOException e){
      e.printStackTrace();
    }
  }
}

javaの場合、文字列が可変長の場合、"byte[]"の代わりに"List"を使う必要が出てきてさらにややこしくなる。

また、javaでは、Byte.parseByteは、内部的にIntegerに変換して128以上だとエラー出すので、しょうもない処理が必要。