- PR -

バイナリデータの読み込み

投稿者投稿内容
Jitta
ぬし
会議室デビュー日: 2002/07/05
投稿数: 6267
お住まい・勤務地: 兵庫県・海手
投稿日時: 2005-05-19 13:42
引用:

具体的には、例えば、1バイト8ビットの中身が、3,2,1,1ビットの4つのデータ(2進数表示)になっている場合です。


ほえ?なんでよ。1バイト(8ビット)なら、2桁でしょ。4つもデータはないよ。10進で4桁なら、2バイト(16ビット)。3211(10)なら、0011 0010 0001 0001(BCD)。

0xf0でマスクして、右へ4ビットシフトした値を10倍し、0x0fでマスクした値を足す。これで1バイト処理。
((oneByte & 0xf0) >> 4) * 10 + (oneByte & 0x0f)
2バイト以上あるなら、右からnバイト目は100^(n-1)を掛けてやる。

_________________
Jubei
ぬし
会議室デビュー日: 2002/03/02
投稿数: 830
お住まい・勤務地: 関西
投稿日時: 2005-05-19 14:11
諸農です。

BCDというのをちょっと調べてみました。
C#でベタベタなんですが、こんな感じでしょうか。

コード:
public static byte[] Int32ToBCD(int AInt)
{
    bool minusFlg = AInt < 0; 
    StringBuilder intStr = new StringBuilder(AInt.ToString());
    if (minusFlg) intStr.Remove(0, 1);
    int len = intStr.Length / 2 + 1;
    byte[] ret = new byte[len];
    for (int i = 0; i < intStr.Length; i++)
    {
        if ((i % 2) == 0)
        {
            ret[i / 2] = byte.Parse(intStr[i].ToString());
            ret[i / 2] <<= 4;
        }
        else
        {
            byte b = byte.Parse(intStr[i].ToString());
            ret[i / 2] |= b;
        }
    }

    byte plusminus = minusFlg ? (byte)13 : (byte)12; 
    if ((intStr.Length % 2) == 0)
    {
        ret[ret.Length - 1] = plusminus;
        ret[ret.Length - 1] <<= 4;
    }
    else
    {
        ret[ret.Length - 1] |= plusminus;
    }
    return ret;
}

public static int BCDToInt32(byte[] ABcd)
{
    bool minusFlg = false; 
    StringBuilder intStr = new StringBuilder(ABcd.Length * 2);
    foreach (byte b in ABcd)
    {
        byte n;
        n = (byte)(b >> 4);
        if (n < 10) intStr.Append(Convert.ToString(n));
        else
        {
            minusFlg = (n == 13);
            break;
        }
        n = (byte)(b << 4);
        n >>= 4;
        if (n < 10) intStr.Append(Convert.ToString(n));
        else
        {
            minusFlg = (n == 13);
            break;
        }
    }
    int ret = Convert.ToInt32(intStr.ToString().Trim());
    if (minusFlg) ret *= -1;
    return ret;
}



_________________
諸農和岳
Powered by Turbo Delphi & Microsoft Visual Studio 2005

十兵衛@わんくま同盟
http://blogs.wankuma.com/jubei/
Jubei
ぬし
会議室デビュー日: 2002/03/02
投稿数: 830
お住まい・勤務地: 関西
投稿日時: 2005-05-19 14:19
引用:

0xf0でマスクして、右へ4ビットシフトした値を10倍し、0x0fでマスクした値を足す。これで1バイト処理。
((oneByte & 0xf0) >> 4) * 10 + (oneByte & 0x0f)



な、なるほど!0xf0と0x0fでマスクかぁ。。
私のコードは右に左にと忙しいコードでした(^_^;)


_________________
諸農和岳
Powered by Turbo Delphi & Microsoft Visual Studio 2005

十兵衛@わんくま同盟
http://blogs.wankuma.com/jubei/
あび
ベテラン
会議室デビュー日: 2004/07/29
投稿数: 59
投稿日時: 2005-05-19 16:22
引用:

Jittaさんの書き込み (2005-05-19 13:42) より:
引用:

具体的には、例えば、1バイト8ビットの中身が、3,2,1,1ビットの4つのデータ(2進数表示)になっている場合です。


ほえ?なんでよ。1バイト(8ビット)なら、2桁でしょ。4つもデータはないよ。10進で4桁なら、2バイト(16ビット)。3211(10)なら、0011 0010 0001 0001(BCD)。



すみません、説明不足と例題の間違いでした。
8ビットの中身が 1011 0010 で、3,2,1,2ビットの4つのデータに分けるということは、
1011 0010
101-------------->=5
1 0----------->=2
0---------->=0
10-------->=2
作成されるデータは、5,2,0,2の4つになります。
Jubei
ぬし
会議室デビュー日: 2002/03/02
投稿数: 830
お住まい・勤務地: 関西
投稿日時: 2005-05-19 16:55
引用:

8ビットの中身が 1011 0010 で、3,2,1,2ビットの4つのデータに分けるということは、
コード:
          1011 0010
          101-------------->=5
             1 0----------->=2
                0---------->=0
                 10-------->=2


作成されるデータは、5,2,0,2の4つになります。



であれば、ベタベタにこんな感じでどうでしょうか。

コード:
private int BCDToInt32(byte ABcd)
{
    int ret = 0;

    byte Mask1 = (byte)224;
    byte Mask2 = (byte)24;
    byte Mask3 = (byte)4;
    byte Mask4 = (byte)3;

    StringBuilder intStr = new StringBuilder();

    byte temp;
    temp = (byte)(ABcd & Mask1);
    temp >>= 5;
    intStr.Append(temp.ToString());
    temp = (byte)(ABcd & Mask2);
    temp >>= 3;
    intStr.Append(temp.ToString());
    temp = (byte)(ABcd & Mask3);
    temp >>= 2;
    intStr.Append(temp.ToString());
    temp = (byte)(ABcd & Mask4);
    intStr.Append(temp.ToString());
    ret = Convert.ToInt32(intStr.ToString().Trim());
    return ret;
}


_________________
諸農和岳
Powered by Turbo Delphi & Microsoft Visual Studio 2005

十兵衛@わんくま同盟
http://blogs.wankuma.com/jubei/
Jitta
ぬし
会議室デビュー日: 2002/07/05
投稿数: 6267
お住まい・勤務地: 兵庫県・海手
投稿日時: 2005-05-20 20:04
引用:

すみません、説明不足と例題の間違いでした。
8ビットの中身が 1011 0010 で、3,2,1,2ビットの4つのデータに分けるということは、
1011 0010
101-------------->=5
1 0----------->=2
0---------->=0
10-------->=2
作成されるデータは、5,2,0,2の4つになります。


???なんか、ランレングス圧縮みたいな感じ???

 当然、8ビットは決まっているけれど、いくつのデータに分けるかは不明、ってことなんでしょうねぇ...例えば、1ビットずつ8つのデータであることもあり得る、と。

ビットシフトで追い出してクリアする
コード:
10110010   0ビット左シフト
10110010   0ビット右シフト
10110010   (8-3)=5ビット右シフト
00000101   →5

10110010   3ビット左シフト
10010000   3ビット右シフト
00010010   ((8-3)-2)=3ビット右シフト
00000010   →2


マスキング
コード:
0ビット目から3ビット目までが1のマスクデータを作る→[11100000]
論理積をとり、(8−3)ビット右シフトする→00000101

(0+3)ビット目から2ビットが1のマスクデータを作る→[00011000]
論理積をとり、(8−3−2)ビット右シフトする→00000010


_________________

スキルアップ/キャリアアップ(JOB@IT)