17

CIではこれを行います

int番号=3510;

char upper = number >> 8;

char lower = number && 8;

SendByte(upper);

SendByte(lower);

上と下の両方が両方である場合=54

C#ではこれを行っています:

            int number = Convert.ToInt16("3510");
            byte upper = byte(number >> 8);
            byte lower = byte(number & 8);
            char upperc = Convert.ToChar(upper);
            char lowerc = Convert.ToChar(lower);
            data = "GETDM" + upperc + lowerc;
            comport.Write(data);

ただし、デバッガー番号= 3510、upper = 13、lower = 0では、コードを>> 6 upper = 54に変更すると、これは意味がありません。これは絶対に奇妙なことです。

基本的には、16ビットの数値から上位バイトと下位バイトを取得し、「GETDM」の後にCOMポートに送信したいだけです。

これどうやってするの?Cではとてもシンプルですが、C#では完全に困惑しています。

4

5 に答える 5

44

マスキングが正しくありません - 8 ではなく 255 (0xff) に対してマスキングする必要があります。下位 8 ビットを保持します。下位 8 ビットのみが設定されたマスクが必要です。つまり、255 です。

int数値を 2 バイトに分割しようとしている場合は、 ( 4バイトの)ではなく、最初から short または ushort にする必要があることに注意してください。

ushort number = Convert.ToUInt16("3510");
byte upper = (byte) (number >> 8);
byte lower = (byte) (number & 0xff);

符号拡張について心配する必要がない場合は、ビット単位の算術演算の方が考えやすいため、ushortここでは代わりにを使用したことに注意してください。byteこの場合、 への縮小変換がbyte機能するため、実際には問題になりませんが、これは考慮すべきことです。

于 2011-03-24T12:56:51.920 に答える
6

あなたはおそらくしたいと思います0x00FF

byte lower = Convert.ToByte(number & 0x00FF);

完全な例:

ushort number = Convert.ToUInt16("3510");
byte upper = Convert.ToByte(number >> 8);
byte lower = Convert.ToByte(number & 0x00FF);
char upperc = Convert.ToChar(upper);
char lowerc = Convert.ToChar(lower);
data = "GETDM" + upperc + lowerc;
于 2011-03-24T12:57:07.667 に答える
4

受け入れられた回答が質問に合っている場合でも、質問のヘッダーに short ではなく int が含まれており、検索結果で誤解を招くという単純な事実のために、不完全であると考えています。C# の Int32 は 32 ビットであり、したがって 4 バイトです。 . Int32 を使用する場合に役立つ例をここに投稿します。Int32 の場合、次のようになります。

  1. LowWordLowByte
  2. LowWordHighByte
  3. HighWordLowByte
  4. ハイワードハイバイト。

そのため、Int32 値をリトル エンディアンの 16 進文字列に変換する次のメソッドを作成しました。この文字列では、すべてのバイトが他のバイトと空白で区切られています。これは、データを送信し、受信者に処理を高速化させたい場合に便利です。受信者は、Split(" ") だけで、スタンドアロンの 16 進文字列として表されるバイトを取得できます。

public static String IntToLittleEndianWhitespacedHexString(int pValue, uint pSize)
{
    String result = String.Empty;

    pSize = pSize < 4 ? pSize : 4;

    byte tmpByte = 0x00;
    for (int i = 0; i < pSize; i++)
    {
        tmpByte = (byte)((pValue >> i * 8) & 0xFF);
        result += tmpByte.ToString("X2") + " ";
    }

    return result.TrimEnd(' ');
}

使用法:

String value1 = ByteArrayUtils.IntToLittleEndianWhitespacedHexString(0x927C, 4);
String value2 = ByteArrayUtils.IntToLittleEndianWhitespacedHexString(0x3FFFF, 4);
String value3 = ByteArrayUtils.IntToLittleEndianWhitespacedHexString(0x927C, 2);
String value4 = ByteArrayUtils.IntToLittleEndianWhitespacedHexString(0x3FFFF, 1);

結果は次のとおりです。

  1. 7C 92 00 00
  2. FF FF 03 00
  3. 7C 92
  4. FF。

私が作成したメソッドを理解するのが難しい場合は、次の方法がよりわかりやすいかもしれません。

public static String IntToLittleEndianWhitespacedHexString(int pValue)
{
    String result = String.Empty;
    byte lowWordLowByte = (byte)(pValue & 0xFF);
    byte lowWordHighByte = (byte)((pValue >> 8) & 0xFF);
    byte highWordLowByte = (byte)((pValue >> 16) & 0xFF);
    byte highWordHighByte = (byte)((pValue >> 24) & 0xFF);

    result = lowWordLowByte.ToString("X2") + " " +
            lowWordHighByte.ToString("X2") + " " +
            highWordLowByte.ToString("X2") + " " +
            highWordHighByte.ToString("X2");

    return result;
}

備考:

  1. もちろん、uint pSize の代わりに、Byte、Word、DoubleWord を指定する列挙型を使用できます。
  2. 16 進文字列に変換してリトル エンディアン文字列を作成する代わりに、文字に変換して、やりたいことを何でもできます。

これが誰かを助けることを願っています!

于 2015-02-10T09:37:29.400 に答える
3

そうではありませんか:

byte lower = (byte) ( number & 0xFF );
于 2011-03-24T12:57:02.723 に答える
1

もう少しクリエイティブに

[System.Runtime.InteropServices.StructLayout( System.Runtime.InteropServices.LayoutKind.Explicit )]
public struct IntToBytes {
    [System.Runtime.InteropServices.FieldOffset(0)]
    public int Int32;
    [System.Runtime.InteropServices.FieldOffset(0)]
    public byte First;
    [System.Runtime.InteropServices.FieldOffset(1)]
    public byte Second;
    [System.Runtime.InteropServices.FieldOffset(2)]
    public byte Third;
    [System.Runtime.InteropServices.FieldOffset(3)]
    public byte Fourth;
}
于 2011-03-24T13:04:06.937 に答える