0

我有一个由 256 个无符号整数组成的数组,称为频率 [256](每个 ascii 值一个整数)。我的目标是通读输入,并且对于每个字符,我都会增加数组中与其对应的整数(例如,字符“A”将导致频率 [65] 整数增加一)并且当输入结束时我必须以小端形式将每个整数输出为 4 个字符。

到目前为止,我已经创建了一个循环,该循环遍历输入并增加数组中每个相应的整数。但是我对如何以小端形式输出每个整数感到非常困惑。我知道每个整数的四个字节中的每个字节都应该作为一个字符输出(例如,小端序中的无符号整数 1 是“00000001 00000000 00000000 00000000”,我希望将其输出为对应于那些的 4 个 ascii 字符字节)。

但是我如何在我的代码中获得无符号整数的二进制表示,我将如何将它切碎并重新排列?

谢谢您的帮助。

4

4 回答 4

3

对于硬件可移植性,请使用以下解决方案:

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);
于 2013-07-28T21:21:51.140 回答
0

在这里“小端”是什么意思还不是很清楚。整数本身没有字节顺序;仅当您将它们切成小块时,字节序才会发挥作用。那么对您来说,哪些较小的部分是指:字节或字符。如果是字符,只需按正常方式转换,并将生成的字符串反转。如果是字节(或任何其他较小的部分),则每个单独的字节都可以表示为 : 的函数,int计算i & 0xFF 低位字节,(i >> 8) & 0xFF下一个最低字节,依此类推。(如果字节不是 8 位,则相应地更改移位值和掩码。)

关于您的第二段: an 的单个字节 int不一定对应于字符,无论编码如何。例如,对于您显示的四个字节,它们都不对应于任何常用编码中的字符。

关于最后一段:要获得无符号整数的二进制表示,请使用与任何表示相同的算法:

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 的基数调用,这将为您提供二进制表示。

于 2013-07-28T22:29:16.573 回答
0

您可以使用memcpywhich 复制一块内存。

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

现在,tab[0]、tab[1] 等将成为您的角色。

于 2013-07-28T21:22:08.887 回答
0

一个从大端到小端交换的程序:Little Endian - Big Endian Problem

要了解您的系统是小端还是大端:https ://stackoverflow.com/a/1024954/2436175 。

将您的字符/整数转换为一组可打印位:https ://stackoverflow.com/a/7349767/2436175

于 2013-07-28T21:32:23.500 回答