C 在文件中打印二进制(字节)值

C 在文件中打印二进制(字节)值,c,biginteger,C,Biginteger,下面的代码以十进制格式将biginteger打印到文件中,如何将代码转换为将二进制数据和十六进制数据打印到文件中 static void print_pos( FILE* f, bigint bi ) { if ( bi_compare( bi_copy( bi ), bi_10 ) >= 0 ) print_pos( f, bi_int_divide( bi_copy( bi ), 10 ) ); putc( bi_int_mod( bi, 10 ) +

下面的代码以十进制格式将biginteger打印到文件中,如何将代码转换为将二进制数据和十六进制数据打印到文件中

static void
print_pos( FILE* f, bigint bi )
{
    if ( bi_compare( bi_copy( bi ), bi_10 ) >= 0 )
        print_pos( f, bi_int_divide( bi_copy( bi ), 10 ) );
    putc( bi_int_mod( bi, 10 ) + '0', f );
}

bi_10只是bigint的一种类型,如何修改上述代码以打印十六进制/二进制数据而不是十进制数据?

要以N为基数打印,需要进行三个更改:

  • 在第二行中,不是除以10,而是除以N
  • 不要在第三行中使用mod 10,而是使用mod base N
  • 您需要将第2行中的模块转换为适当的字符。如果您正在执行base>10,则需要执行If/else
  • 下面是使用普通整数时的情况。我将允许您进行适当的更改以使用大int库:

    static void
    print_pos( FILE* f, int n, int base )
    {
        if (n < 0)
        {
            n *= -1;
            putc( '-', f );
        }
    
        if (n >= base)
            print_pos( f, n / base, base );
    
        int d = n % base;
        const char *digits = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ";
        putc( digits[d], f );
    }
    
    静态无效
    打印位置(文件*f,整数n,整数基)
    {
    if(n<0)
    {
    n*=-1;
    putc('-',f);
    }
    如果(n>=base)
    打印位置(f、n/底座、底座);
    int d=n%基数;
    常量字符*digits=“0123456789abcdefghijklmnopqrstuvxyz”;
    putc(数字[d],f);
    }
    
    最后几点评论

  • 您的原始代码忘记处理负数
  • 此功能可工作到基36。如果您想要更大的基数,则需要扩展
    charc=…

  • +回答得好。请注意,“A”+1不能保证为“B”(或者通常,“A”…“Z”不需要是连续的)0'..'9'保证是连续的。@Alok-理论上我知道字母和数字都不需要顺序。也就是说,你知道有哪种编码仍然常用,但却不能做到这一点吗?也就是说,我已经改为数组,使其在不考虑编码的情况下工作。数字必须是顺序的,因为C标准是这样规定的。对于字母,EBCDIC是字母值不连续的示例。引用EBCDIC上的Wikipedia页面:所有IBM大型机外围设备和操作系统(zSeries或iSeries上的Linux除外)都使用EBCDIC作为其固有编码。如果基2只给出1和0,我需要以二进制格式(字节值?)获取。但我需要的是不可读的二进制格式,它必须使用哪个基??如果不可读的二进制格式,你指的是原始数据,那么你如何获得它将取决于你的bigint实现。如果您使用的是来自axTLS的bigint实现,请查看bi_导出。如果base 2只提供1和0,则需要使用二进制格式(字节值?)。但我需要的是不可读的二进制格式,它必须使用哪个基?C语言中任何与JAVA.toByteArray()或getBytes()方法等价的东西?但是对于这个大的十进制字符字符串,必须使用哪个基来获取Bytearray?谢谢