20

unsignedchar配列[248]があります。バイトでいっぱい。2F AF FF 00 EB AB CD EFのように.....この配列は、UART(RS232)からのデータをバッファとして保存するバイトストリームです。

ここで、バイトをuint16とint32に変換し直したいと思います。

C#では、これを行うためにBitConverterクラスを使用しました。例えば:

byte[] Array = { 0A, AB, CD, 25 };
int myint1 = BitConverter.ToInt32(bytes, 0);
int myint2 = BitConverter.ToInt32(bytes, 4);
int myint3 = BitConverter.ToInt32(bytes, 8);
int myint4 = BitConverter.ToInt32(bytes, 12);
//...
enter code here
Console.WriteLine("int: {0}", myint1); //output Data...

Cにも同様の関数がありますか?(.netはありません。コードはマイクロコントローラーで実行されているため、KEILコンパイラーを使用します)

よろしくサム

4

4 に答える 4

36

Cでは、これを行うための標準関数はありません。バイトをアセンブルして、16ビットと32ビットの整数に戻す必要があります。エンディアンに注意してください!

簡単なリトルエンディアンの例を次に示します。

extern uint8_t *bytes;
uint32_t myInt1 = bytes[0] + (bytes[1] << 8) + (bytes[2] << 16) + (bytes[3] << 24);

ビッグエンディアンシステムの場合、これは正反対の順序です。

uint32_t myInt1 = (bytes[0] << 24) + (bytes[1] << 16) + (bytes[2] << 8) + bytes[3];

あなたは逃げることができるかもしれません:

uint32_t myInt1 = *(uint32_t *)bytes;

配置の問題に注意している場合。

于 2012-09-02T22:36:07.537 に答える
20

はいあります。あなたのバイトが次の中にあると仮定します:

uint8_t bytes[N] = { /* whatever */ };

16ビット整数は連結された2つの8ビット整数です。つまり、1つは256の倍数であるか、あるいは8だけシフトされます。

uint16_t sixteen[N/2];

for (i = 0; i < N; i += 2)
    sixteen[i/2] = bytes[i] | (uint16_t)bytes[i+1] << 8;
             // assuming you have read your bytes little-endian

同様に32ビットの場合:

uint32_t thirty_two[N/4];

for (i = 0; i < N; i += 4)
    thirty_two[i/4] = bytes[i] | (uint32_t)bytes[i+1] << 8
        | (uint32_t)bytes[i+2] << 16 | (uint32_t)bytes[i+3] << 24;
             // same assumption

バイトがビッグエンディアンで読み取られる場合は、もちろん、順序を逆にします。

bytes[i+1] | (uint16_t)bytes[i] << 8

bytes[i+3] | (uint32_t)bytes[i+2] << 8
    | (uint32_t)bytes[i+1] << 16 | (uint32_t)bytes[i] << 24

保存された整数のエンディアンと実行中のアーキテクチャのエンディアンには違いがあることに注意してください。この回答で参照されているエンディアンは、格納されている整数、つまり。の内容ですbytesシフト時にエンディアンが処理されるため、ソリューションは実行中のアーキテクチャのエンディアンに依存しません。

于 2012-09-02T22:36:59.890 に答える
4

リトルエンディアンの場合、memcpyだけを使用することはできませんか?

memcpy((char*)&myint1, aesData.inputData[startindex], length);
于 2017-07-03T08:47:45.110 に答える
1
            char letter = 'A';
            size_t filter = letter;
            filter = (filter <<  8 | filter);
            filter = (filter << 16 | filter);
            filter = (filter << 32 | filter);
            printf("filter: %#I64x \n", filter); 

結果: "フィルター:0x4141414141414141"

于 2017-03-10T13:00:04.883 に答える