3

私は16ビットを持っています。各ビットで、いくつかのプロパティを設定し、COM ポート (フィスカル プリンター) に送信できます。例: 0 ビットがチェックされている場合、チェック時にロゴを表示します。

この 16 ビットを 4 バイトに変換して、COM ポートに送信する必要があります。例: 0 ビットがチェックされている場合、4 バイトは 0x30、0x31、0x30、0x30 になります。COM ポート監視 API で取得した結果のバイト数。

16 ビットから 4 バイトを取得するには、何をしなければなりませんか?

その他の例:

  • 1 ビットをチェック - 0x30、0x32、0x30、0x30
  • 2 ビットをチェック - 0x30、0x34、0x30、0x30
  • 0 および 2 ビットをチェック - 0x30、0x35、0x30、0x30
  • 0 および 9 ビットをチェック - 0x30、0x31、0x30、0x32
  • 0、1、2、3、4、5、9 ビットをチェック - 0x33、0x46、0x30、0x32
4

4 に答える 4

2

ASCII では 0x30 = '0' であることに注意してください。16ビットを16進数の2バイトとして送信しているように見えます。最初にビット0〜7、次に8〜15です。つまり、送信したい

  • ビット 4 ~ 7 の 16 進数
  • ビット 0 ~ 3 の 16 進数
  • ビット 12 ~ 15 の 16 進数
  • ビット 8 ~ 11 の 16 進数

確認するにはさらにデータ ポイントが必要ですが、これは上記の例に適合します。

bit 0 set encodes to string "0100" = 0x30 0x31 0x30 0x30
bit 1 set                   "0200" = 0x30 0x32 0x30 0x30
bit 2 set                   "0400" = 0x30 0x34 0x30 0x30
0+2                         "0500" = 0x30 0x30 0x30 0x30
0+9                         "0102" = 0x30 0x31 0x30 0x32
0,1,2,3,4,5,9               "3F02" = 0x33 0x46 0x30 0x32

つまり、Java では、ビットが単一の整数にあるn場合、おそらく必要な場合があります

String output = Integer.toHexString((n >> 4) & 0xf)
              + Integer.toHexString(n & 0xf)
              + Integer.toHexString((n >> 12) & 0xf)
              + Integer.toHexString((n >> 8) & 0xf);
byte[] data = output.toUpperCase().getBytes("ASCII");

文字列を介して、または

byte[] data = new byte[4];
data[0] = (byte)((n >> 4) & 0xf);
data[1] = (byte)(n & 0xf);
data[2] = (byte)((n >> 12) & 0xf);
data[3] = (byte)((n >> 8) & 0xf);
for(int i = 0; i < 4; ++i) {
    data[i] += (data[i] < 10) ? '0' : ('A' - 10);
}

弦を避けます。

4バイトを解析して単一のintに戻すには、次を使用できます

int bits = (((data[0] & 0xf) + ((data[0] >= 'A') ? 9 : 0)) << 4)
           | ((data[1] & 0xf) + ((data[1] >= 'A') ? 9 : 0))
           | (((data[2] & 0xf) + ((data[2] >= 'A') ? 9 : 0)) << 12)
           | (((data[3] & 0xf) + ((data[3] >= 'A') ? 9 : 0)) << 8);

明らかに、ここでは入力チェックはありません。期待される形式で入力を取得すると仮定しています。括弧内のメイン ビットは、文字列から単一の 16 進数を解析するだけです。必要に応じて、それをリファクタリングするか、より堅牢なものを実装できます。

于 2012-04-05T09:19:23.480 に答える
0

まあ、16 ビットは 2 バイトです。したがって、これらの 2 バイトを半分に分割すると、4 バイトになります。

基本的には

byte b = ...;

byte firstHalf = (byte)((b & 0x0F) >> 4);
byte secondHalf = (byte)(b & 0xF0);

ただし、これは基本的に単なる分割であり、質問で説明した結果は得られないことに注意してください。すでに指摘したように、チェックする必要がある「0」ビットと、それらの 0x30 0x31 0x30 0x30 値を取得する方法が明確ではありません (16 ビットを 4 のパケットに分割し、それらをそれぞれバイトに入れます)。

于 2012-04-05T08:57:40.663 に答える
0

よく分からない:

あなたは16ビットを持っていますが、これは2バイトしかないので、最初の2バイトを0のままにして、最後の2バイトで16ビットを使用することができます...

Byte1: 0000 0000
Byte2: 0000 0000
Byte3: first 8 bits of your 16 bits
Byte4: second 8 bits of your 16 bits

編集: 0x30、0x30、0x31、0x30 を取得する方法がわかりません

0x は 16 進数を表します

0x30 16 進数 = 0011 0000 2 進数なので、0x00 の代わりに 0x30 を使用する理由がわかりません...

于 2012-04-05T09:00:19.913 に答える
0

この質問は解釈の余地が少しありますが、次のことを意味していると思います。

16 ビット データ型が設定されている場合は、各ビットをチェックする必要があります。設定されている場合は、データを COM ポートに送信する必要があります。送信する必要があるデータは、設定されたビットによって異なります。ところで、送信する必要があるデータは常に 4 バイト長です。

チェックする必要があるビットが Java 、つまり上位 16 ビットが常に 0 である 32 ビット整数として入ってくると仮定しましょう。ビットをintチェックするために BitSet を使用し、ビットが設定されています:

private static final byte[][] BYTES_TO_SEND = new byte[][] { { 0x30, 0x31, 0x30, 0x30 }, // ビット #0 がチェックされた場合に送信するデータ { 0x42 }, // ビット # の場合に送信するデータ1 がチェックされている // ... ビット #2、#3、... がチェックされている場合に送信するデータ };

プライベート OutputStream com;

private static final byte[][] BYTES_TO_SEND = new byte[][] {
    { 0x30, 0x31, 0x30, 0x30 }, // data to send if bit #0 is checked
    { 0x42 }, // data to send if bit #1 is checked
// ... data to send if bit #2, #3, ... is checked
};

private OutputStream com;

public void initializeCOMFromBits(int bits) throws IOException {
  for (byte[] toSendIfSet : BYTES_TO_SEND) {
    if ((bits & 0x1) == 0x1) { // check if the lowest bit is set
      com.write(toSendIfSet);
    }
    bits >>>= 1; // shift all bits by one to the left
    // now the lowest bit if the bit that was second-to-lowest previously
  }
  assert bits == 0 : "There should be at most " + BYTES_TO_SEND.length + " bits set in the incoming bit set";
}

ビットが BitSet にある場合は、ループをインデックス付きの for ループに変更し、i 番目のビットをチェックします- 設定されている場合は、COM ポート.get(i)に送信します。BYTES_TO_SEND[i]

于 2012-04-05T09:17:54.497 に答える