【问题标题】:Printing Binary(byte) value in File在文件中打印二进制(字节)值
【发布时间】:2010-01-07 07:16:08
【问题描述】:

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

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 类型,如何修改上面的代码以打印十六进制/二进制数据而不是十进制数据?

【问题讨论】:

  • 如果 base 2 只给出 1 和 0 ,我需要输入 BINARY FORMAT (字节值?)。但我需要不可读的二进制格式,必须使用哪个基数??
  • C 中任何等同于 JAVA .toByteArray() 或 getBytes() 方法的东西?但是对于这个大十进制字符字符串,必须使用哪个基数来获取 Bytearray ?非常感谢

标签: c biginteger


【解决方案1】:

要以 N 为底进行打印,需要进行三处更改:

  1. 第二行不是除以 10,而是除以 N
  2. 不是在第三行做 mod 10,而是做 mod base N
  3. 您需要将第 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 );
}

最后几场比赛。

  1. 您的原始代码忘记处理负数。
  2. 此函数最多可使用 36 个基数。如果您想要更大的基数,则需要扩展 char c = ... 行。

【讨论】:

  • +1,很好的答案。请注意,不保证 'A' + 1 是 'B'(或者通常,'A'..'Z' 不必是连续的)。 '0'..'9' 保证是连续的。
  • @Alok - 我理论上知道字母和数字都不需要连续。也就是说,您是否知道仍然常用但不这样做的任何编码?也就是说,我已更改为数组以使其工作,而不管编码如何。
  • 数字必须是连续的,因为 C 标准是这样说的。对于字母,EBCDIC 是一个示例,其中字母的值不连续。引用 EBCDIC 上的 Wikipedia 页面:所有 IBM 大型机外围设备和操作系统(zSeries 或 iSeries 上的 Linux 除外)都使用 EBCDIC 作为其固有编码。
  • 如果 base 2 只给出 1 和 0 ,我需要输入 BINARY FORMAT(字节值?)。但我需要不可读的二进制格式,必须使用哪个基数??
  • 如果通过不可读的二进制格式,您的意思是原始数据,那么您如何获得将取决于您的 bigint 实现。如果您使用 axTLS 中的 bigint 实现,请查看 bi_export。
猜你喜欢
  • 2019-08-22
  • 2023-04-07
  • 2011-02-21
  • 1970-01-01
  • 1970-01-01
  • 2023-03-03
  • 2013-05-22
  • 2014-09-05
  • 1970-01-01
相关资源
最近更新 更多