簡體   English   中英

將整數打印為4個字節的集合(以Little Endian排列)?

[英]Printing integers as a set of 4 bytes arranged in little endian?

我有一個256個無符號整數的數組,這些整數稱為frequency [256](每個ascii值一個整數)。 我的目標是讀取輸入,對於每個字符,我將增加與之對應的數組中的整數(例如,字符“ A”將使frequencys [65]整數增加1),並且當輸入結束時我必須以小尾數形式將每個整數輸出為4個字符。

到目前為止,我已經做了一個遍歷輸入的循環,並增加了數組中每個對應的整數。 但是我對如何以小端序形式輸出每個整數感到非常困惑。 我知道每個整數的四個字節中的每個字節都應作為字符輸出(例如,little endian中的無符號整數1是“ 00000001 00000000 00000000 00000000”,我希望將其輸出為與那些字符對應的4個ascii字符)個字節)。

但是,如何獲取代碼中無符號整數的二進制表示形式,以及如何將其切碎並重新排列呢?

謝謝您的幫助。

為了實現硬件可移植性,請使用以下解決方案:

int freqs[256];
for (int i = 0; i < 256; ++i)
    printf("%02x %02x %02x %02x\n", (freqs[i] >> 0 ) & 0xFF
                                  , (freqs[i] >> 8 ) & 0xFF
                                  , (freqs[i] >> 16) & 0xFF
                                  , (freqs[i] >> 24) & 0xFF);

您可以使用memcpy復制一塊內存。

char tab[4] ; 
memcpy(tab, frequencies+i, sizeof(int));

現在,tab [0],tab [1]等將成為您的角色。

從大端到小端的交換程序: -大端問題

要了解您的系統是小端字節序還是大端字節序: https : //stackoverflow.com/a/1024954/2436175

以一組可打印的位來轉換您的字符/整數: https : //stackoverflow.com/a/7349767/2436175

目前還不清楚您所說的“小端”。 整數本身沒有字節序; 僅當將它們切成小塊時,endianness才起作用。 因此,您要指出的是較小的部分:字節或字符。 如果是字符,則以常規方式轉換,然后反轉生成的字符串。 如果是字節(或其他較小的字節),則每個字節都可以表示為int的函數: i & 0xFF計算低位字節, (i >> 8) & 0xFF第二個字節,依此類推。 (如果字節不是8位,則相應地更改移位值和掩碼。)

關於第二段: int的單個字節不一定與字符相對應,而與encodig無關。 例如,對於您顯示的四個字節,它們中的任何一個都不對應於任何常用編碼中的字符。

關於最后一段:要獲取無符號整數的二進制表示形式,請使用與任何表示形式相同的算法:

std::string
asText( unsigned int value, int base, int minDigits = 1 )
{
    static std::string digits( "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ" );
    assert( base >= 2 && base <= digits.size() );
    std::string results;
    while ( value != 0 || minDigits > 0 ) {
        results += digits[ value % base ];
        value /= base;
        -- minDigits;
    }
    //  results is now little endian.  For the normal big-endian
    std::reverse( results.begin(), results.end() );
    return results;
}

以等於2的底數進行調用,這將為您提供二進制表示形式。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM