2017-08-16 35 views
-1

データキャプチャ製品によってメインフレームからトランザクションデータ(json形式)が送信されています。 JSONでは、トランザクションタイムスタンプ相当のメインフレームtimeOfDay(TOD)の値を送信することになっています。 代わりに値 "STCK" を送信するのでは: "00d2fde04305b72642"Javaは16進UTF8をUTF-16に変換します

彼らは代わりに "STCK" 私を送っている: "\ u00c3 \ u0092 \ u00c3 \ u00bd \ u00c2 \ u00aa \ u00c2 \ u009e \ u001c \ u00c2 \ u0089 \ u001cG」

彼らは

を述べ、なぜ私はそれらを尋ねた 『上(』 STCK 『:』 00d2fde04305b72642" )は、バイナリデータをUTF-16形式で、我々は変換しているので、JSONのバイナリデータとうまく動作しません。それを16進UTF-8形式に変換して、それをあなたの側のUTF-16に戻すことができます。 "

これはJavaでこれを行うのに役立つ必要があります。私は複数の質問を見ましたが、正確に何もしようとしていることは、16進UTF-8をUTF-16に変換することです。うまくいけば "00d2fde04305b72642"のようになります

私はどのようにこの結果得られたTOD値( "stck": "00d2fde04305b72642")をjavaを使用してトランザクションのタイムスタンプに変換して、その部分について説明します。

+0

私は上記の背景を与えているが、基本的に私の質問は、上記の六角UTF-8値(\ u00c3 \ u0092 \ u00c3 \ u00bd \ u00c2 \ u00aa \ u00c2 \ u009e \ u001cの\のu00c2を変換する方法であります\ u0089 \ u001cG)を00d2fde04305b72642の値に...使用しています 00d2fde04305b72642に変換する前にこのUTF-8をUTF-16に変換する必要があるかどうかは重要ではない – garryS

+0

これらの文字列は単一の値?この番号で行われた卑劣な腐敗を解明する私の推測は、 'd2fde04305b72642'ではなく' d2fdaa9e1c891c47'です。 2つの異なるタイムスタンプの情報を含めることは可能でしょうか? – erickson

+1

_ "バイナリデータUTF-16形式"という用語は非常に疑わしいです - UTF-8とUTF-16は、タイムスタンプが文字列としてフォーマットされていない限り、タイムスタンプなどのバイナリ情報ではなく、文字列を表現する方法です。誰かがバイナリ値を取得し、それをUTF-8として解釈し、それをUTF-16としてエンコードした場合、可能な数のバイナリ文字列ではうまくいかないため、ここでは何が起こっているのかは不明です。また、想定されるUTF-16文字列の最後にある 'G'は何ですか?有効な質問のためにここに十分な情報がないようです。 –

答えて

1

「彼ら」は間違っている。彼らは単に16進数で数値を符号化し、結果の文字列を使用する必要があります。

代わりに、数値のバイトを文字として扱い、UTF-8でエンコードしています。次に、これらのバイトを取り、ASCII以外の文字にUnicodeエスケープシーケンスを適用します。傷害に侮辱を加えて、彼らはプロセスについて尋ねられたときナンセンスで答えた。それは多くのレベルで災害です。

次のようにすると、データをリカバリしてJavaタイムスタンプに変換できます。

import java.nio.charset.StandardCharsets; 
import java.time.Instant; 
import java.time.OffsetDateTime; 
import java.time.temporal.ChronoUnit; 

public class SO45704851 
{ 

    public static void main(String... argv) 
    throws Exception 
    { 
    String example = "\u00c3\u0092\u00c3\u00bd\u00c2\u00aa\u00c2\u009e\u001c\u00c2\u0089\u001cG"; 
    long tod = sbrogliare(example); 
    System.out.printf("ToD: 0x%016x%n", tod); 
    Instant time = toInstant(tod); 
    System.out.printf("Instant: %s%n", time); 
    } 

    /** 
    * Clean up an infernal mess, miraculously bestowing a 64-bit time-of-day. 
    */ 
    public static long sbrogliare(String garbage) 
    { 
    byte[] utf8 = new byte[garbage.length()]; 
    for (int idx = 0; idx < garbage.length(); ++idx) 
     utf8[idx] = (byte) garbage.charAt(idx); 
    String raw = new String(utf8, StandardCharsets.UTF_8); 
    if (raw.length() != 8) 
     throw new IllegalArgumentException(); 
    long n = 0; 
    for (int idx = 0; idx < raw.length(); ++idx) { 
     char ch = raw.charAt(idx); 
     if (ch > 255) 
     throw new IllegalArgumentException(); 
     n = n << 8 | ch; 
    } 
    return n; 
    } 

    private static final OffsetDateTime zero = OffsetDateTime.parse("1900-01-01T00:00Z"); 

    /** 
    * Convert 64-bit time-of-day to {@code Instant}. 
    */ 
    public static Instant toInstant(long tod) 
    { 
    long nanos = (125 * (tod >>> 32) << 23) + (125 * (tod & 0xFFFFFFFFL) >>> 9); 
    return zero.plus(nanos, ChronoUnit.NANOS).toInstant(); 
    } 

} 
+0

ありがとう、トン@erickson。それは完璧な仕事です。 – garryS

関連する問題