5

組み込みUSBプロジェクトのファームウェアに取り組んでいます。使用したいプロダクションプログラマーは、シリアル番号をデバイスのフラッシュメモリの指定されたメモリアドレスに自動的に書き込みます。プログラマーは、シリアル番号を指定されたバイト数の16進数として格納します。たとえば、シリアル番号123456をアドレス0x3C00に保存するように指示すると、メモリは次のようになります。

0x3C00  -  00
0x3C01  -  01
0x3C02  -  E2
0x3C03  -  40
//(123456 in Hex = 1E240)

問題は、ホストアプリケーションがデバイスからシリアル番号を読み取るときに、Unicode文字配列を探していることです。だから私のシリアル番号は...

{ '1','0',
  '2','0',
  '3','0',
  '4','0',
  '5','0',
  '6','0'}

いつ

それで、私がCで書いている私のファームウェアでは、フラッシュから16進シリアル番号を取得し、それをUnicode char配列にエンコードして、Ramの変数に格納することは可能ですか?

4

5 に答える 5

5

あなたが望むようです:

wsprintf(wchar_buffer, L"%d", serial_number)

(シリアル番号が32ビット整数に収まると仮定します。いずれの場合も、wsprintfシリアル番号をwchar(ユニコード)文字列として出力します。

于 2010-03-04T19:30:05.197 に答える
4

次のようなものを使用できるはずです。

wchar_t buf[10];
swprintf(buf, L"%d", your_int_value);

詳細は、Cランタイムライブラリの正確な実装によって異なる場合があります。たとえばswprintf()、次の文字数を期待できbufます。

swprintf(buf, sizeof(buf)/sizeof(buf[0]), L"%d", your_int_value);
于 2010-03-04T19:29:05.573 に答える
2

このコードがお使いのデバイスに適合するかどうかはわかりませんが、試してみましょう

char buffer[MAX_SIZE];
char unicodeBuffer[MAX_SIZE];
sprintf(buffer, "%d", i);
int len = strlen(buffer);
int i = 0;
for (int i = 0; i <= (len << 1) - 2; i++)
   unicodeBuffer[i] = i % 2 ? buffer[i] : 0;
unicodeBuffer[i + 1] = 0;
unicodeBuffer[i + 2] = 0;
于 2010-03-04T19:30:59.657 に答える
2

シリアル番号が32ビットに収まり、プラットフォームがビッグエンディアンで、Unicode、32ビットint、および標準Cライブラリをサポートしている場合、他の回答が示しているように、これは非常に簡単です。プラットフォームに32ビットintと8ビットcharがあるが、リトルエンディアンであるか、Unicodeをサポートしていない場合、およびシリアル番号の長さが異なる可能性がある場合は、少し巧妙ですが、以下が役立つ場合があります。

void extract_serial_number(unsigned char* address, unsigned int bytes, char* buffer) {
    unsigned int value = 0;
    char c, *start = buffer;
    while (bytes--) {                      /* read the serial number into an integer */
        value = value << 8;
        value |= *address++;
    }
    while (value > 0) {                    /* convert to 16 bit Unicode (reversed) */
        *buffer++ = '0' + value % 10;
        *buffer++ = '\0';
        value /= 10;
    }
    *buffer++ = '\0';
    *buffer++ = '\0';
    buffer -= 4;
    while (buffer > start) {               /* reverse the string */
        c = *buffer;
        *buffer = *start;
        *start = c;
        buffer -= 2;
        start += 2;
    }
}
于 2010-03-04T20:57:36.393 に答える
2

sprintf組み込み環境にアクセスできる場合、これは機能するはずです。

#define MAX_SIZE(type) ((CHAR_BIT * sizeof(type) - 1) / 3 + 2)

/* Destination UCS2 buffer size must be at least 2*MAX_SIZE(int) */
void int_to_ucs2(char *dest, int q)
{
    char buffer[MAX_SIZE(q)];
    char *src = buffer;

    sprintf(buffer, "%d", q);

    do {
        *dest++ = *src;
        *dest++ = 0;
    } while (*src++);
}
于 2010-03-04T23:16:30.120 に答える