2

文字列をどのようにlongに格納/表現しますか?次に、それを8バイト配列に詰め込みますか?

私が試した/一緒に働いたこと

    String eidString = "Awesome!";
    ByteBuffer buf = ByteBuffer.allocate(8);
    CharBuffer cbuf = buf.asCharBuffer();
    cbuf.put(eidString);

    byte[] eid = ByteBuffer.allocate(8).putLong(cbuf ??);

試行2

    Long l = Long.valueOf("Awesome!");

    byte[] eid = ByteBuffer.allocate(8).putLong(l).array();

    long p = ByteBuffer.wrap(eid).getLong();

    System.out.println(p);

試行3

String input = "hello long world";

byte[] bytes = input.getBytes();
LongBuffer tmpBuf = ByteBuffer.wrap(bytes).asLongBuffer();

long[] lArr = new long[tmpBuf.remaining()];
for (int i = 0; i < lArr.length; i++)
    lArr[i] = tmpBuf.get();

System.out.println(input);
System.out.println(Arrays.toString(lArr));
// store longs...

// ...load longs
long[] longs = { 7522537965568945263L, 7955362964116237412L };
byte[] inputBytes = new byte[longs.length * 8];
ByteBuffer bbuf = ByteBuffer.wrap(inputBytes);
for (long l : longs)
    bbuf.putLong(l);
System.out.println(new String(inputBytes));
4

4 に答える 4

3

文字列を数値としてエンコードし、逆にする必要があります。

  • 必要なシンボルの数を決定する必要があります。たとえば、64 シンボルには 6 ビットが必要です。32 シンボルには 5 ビットが必要です。
  • これにより、文字列の最大長が決まります。たとえば、6 ビットの場合 => 64/6 = 10 シンボル、8 ビットの場合 => 64/8 = 8 シンボル。たとえば、"hello long world" は、すべての az が利用可能であると想定しない限り、適切ではありません。

これが完了したら、10 基または 36 基数を解析するのと同じ方法でシンボルをエンコードできます。文字列に戻すには、逆の操作を行います (基数 10 または 36 の数値を出力するなど)。

可能な文字/記号の範囲は? (文字列の長さが異なる場合があるため、終了記号を含める必要があります)

于 2013-01-03T19:49:20.343 に答える
1

String を Long に解析するには、Long ラッパー クラスを使用できます。

String myString = "1500000";
Long myLong = Long.parseLong(myString);

それを8バイト配列に詰め込むには...

long value = myLong.longValue();
byte[] bytes = new byte[8];
for (int i = 0; i < bytes.length; i++) {
   long mask = 0xFF00000000000000 >> (i * 8);
   bytes[i] = (byte) (value & mask);   
}

この例はビッグエンディアンです。

String を long にエンコードする場合は、次のようにすることができます。

String myString = "HELLO";
long toLong = 0;
for (int i = 0; i < myString.length(); i++) {
   long c = (long) myString.charAt(i);
   int shift = (myString.length() - 1 - i) * 8;
   toLong += c << shift;
}

これはテストされていません。それにはいくつか問題があるかもしれません。

于 2013-01-03T18:43:22.003 に答える
0

その必要はありません。String には getBytes() というメソッドがあります。それはあなたのために直接変換します。パラメータ「Hallelujah」で次のメソッドを呼び出します

public static void strToLong(String s) throws IOException
{
    byte[] bArr = s.getBytes();
    for( byte b : bArr)
    {
        System.out.print(" " + b);
    }
    System.out.println();

    System.out.write(bArr);
}

結果は

 72 97 108 108 101 108 117 106 97 104
Hallelujah
于 2013-01-03T19:58:08.973 に答える