打印整数作为一组4个字节排列在小端?

时间:2013-07-28 21:16:23

标签: c++ character-encoding endianness

我有一个256个无符号整数的数组,称为频率[256](每个ascii值一个整数)。我的目标是通读输入,并且对于每个字符,我增加与其对应的数组中的整数(例如,字符'A'将使频率[65]整数增加1)并且当输入结束时我必须在little endian form中将每个整数输出为4个字符。

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

但是我如何在代码中得到无符号整数的二进制表示,我将如何将其砍掉并重新排列呢?

感谢您的帮助。

4 个答案:

答案 0 :(得分: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);

答案 1 :(得分:0)

您可以使用复制内存块的memcpy

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

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

答案 2 :(得分:0)

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

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

在一组可打印位中转换字符/整数:https://stackoverflow.com/a/7349767/2436175

答案 3 :(得分:0)

这里的“小端”并不是很清楚你的意思。 整数本身没有字节序;只有字节序 当你把它们切成小块时发挥作用。那么哪个 小块你的意思是:字节或字符。如果是人物, 只是以正常方式转换,并反转生成的 串。如果字节(或任何其他较小的一块),每个人 byte可以表示为inti & 0xFF的函数 计算下一个低位字节(i >> 8) & 0xFF 最低等等。 (如果字节不是8位,则更改 相应的移位值和掩码。)

关于你的第二段:一个字节 无论如何,int不一定对应于角色 编辑。对于您显示的四个字节,例如,none 它们对应于任何一般的角色 编码。

关于最后一段:获取二进制文件 无符号整数的表示,使用相同的算法 您将用于任何表示:

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;
}

用base等于2调用,这将为你提供二进制文件 表示。