AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / unix / 问题 / 526611
Accepted
Andriy Makukha
Andriy Makukha
Asked: 2019-06-25 05:05:46 +0800 CST2019-06-25 05:05:46 +0800 CST 2019-06-25 05:05:46 +0800 CST

版本 5 Unix 使用什么校验和算法?

  • 772

我不知道在 Unix V5 和 V6 中该sum命令使用了什么算法。

起初,我认为它是字节模数 2^16 的简单总和。然而,对于重复 320 次的字符串“1111111111\n”,它计算的校验和为28930(使用Julius Schmidt 的 JavaScript 的 PDP-11 模拟器)。而它的简单字节总和要小两个字节:

$ python -c 'print(sum(bytearray(b"1111111111\n"*320)) & 0xFFFF)'
28928

后来,从MacOS 的手册页中,我发现sumandcksum命令有很长的不一致历史。然而,即使是 MacOS 上提供的“历史”算法版本也不同意 Unix V5 的校验和。最接近的匹配是 UNIX System V 的默认sum命令(在 Mac 上调用,如cksum -o 2),它为此字符串返回相同的校验和,但不同意其他命令:

$ python -c 'print("1111111111\n"*320, end="")' | cksum -o 2
28930 7

更具体地说,cksum -o 2和 Unix V5sum对模拟器中的大多数二进制文件(例如,在文件夹中/bin)产生不同的输出,尽管它们在大多数文本文件上是一致的。

这是模拟器中的真实行为还是错误?如果是正版,是什么算法?

PS这是源代码,如果有人可以阅读1974年的汇编代码。

historical-unix checksum
  • 1 1 个回答
  • 417 Views

1 个回答

  • Voted
  1. Best Answer
    palupicu
    2019-06-25T09:06:17+08:002019-06-25T09:06:17+08:00

    起初,我以为它是字节模数 2^16 的简单总和

    它是一个 sum mod 2^16,只是每次溢出时都会加一个 1。此外,字节将在添加到总和之前进行符号扩展。这是程序集中的“注释”片段:

    # r2 is the pointer into the data
    # r0 is the length of the data
    # r5 is the sum
    2:
            movb    (r2)+,r4    # r4 = sign_extend(*r2++)
            add     r4,r5       # r5 += r4
            adc     r5          # if(r5 overflowed) r5++
            sob     r0,2b       # if(--r0) goto 2 above
    

    同样放入一个小的 C 程序(用作./v5sum < file):

    #include <stdio.h>
    int main(void){
            int c, s = 0;
            while((c = getchar()) != EOF){
                    s += c & 0x80 ? c | 0xff00 : c; // alternative: s += (unsigned short)(signed char)c
                    if(s & 0x10000){ s++; s &= 0xffff; };
            }
            printf("%d\n", s);
            return 0;
    }
    

    更具体地说, cksum -o 2 和 Unix V5 的 sum 对模拟器中的大多数二进制文件(例如,文件夹 /bin)产生不同的输出,尽管它们在大多数文本文件上是一致的。

    那是因为原始的 unix v5sum将对字符进行符号扩展,并且只有二进制文件包含 >= 0x80 的字节。否则,算法应该相似,并且仅与非常大的文件不同(其中字符的总和将溢出 32 位无符号整数)。

    • 4

相关问题

  • 将 pv 与 find -exec 一起使用

  • elfsign 和 elfverify 发生了什么?

  • 为什么 crc32 说我的一些文件是“坏的”?

  • 我在哪里可以获得原始的 Unix?[复制]

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    模块 i915 可能缺少固件 /lib/firmware/i915/*

    • 3 个回答
  • Marko Smith

    无法获取 jessie backports 存储库

    • 4 个回答
  • Marko Smith

    如何将 GPG 私钥和公钥导出到文件

    • 4 个回答
  • Marko Smith

    我们如何运行存储在变量中的命令?

    • 5 个回答
  • Marko Smith

    如何配置 systemd-resolved 和 systemd-networkd 以使用本地 DNS 服务器来解析本地域和远程 DNS 服务器来解析远程域?

    • 3 个回答
  • Marko Smith

    dist-upgrade 后 Kali Linux 中的 apt-get update 错误 [重复]

    • 2 个回答
  • Marko Smith

    如何从 systemctl 服务日志中查看最新的 x 行

    • 5 个回答
  • Marko Smith

    Nano - 跳转到文件末尾

    • 8 个回答
  • Marko Smith

    grub 错误:你需要先加载内核

    • 4 个回答
  • Marko Smith

    如何下载软件包而不是使用 apt-get 命令安装它?

    • 7 个回答
  • Martin Hope
    user12345 无法获取 jessie backports 存储库 2019-03-27 04:39:28 +0800 CST
  • Martin Hope
    Carl 为什么大多数 systemd 示例都包含 WantedBy=multi-user.target? 2019-03-15 11:49:25 +0800 CST
  • Martin Hope
    rocky 如何将 GPG 私钥和公钥导出到文件 2018-11-16 05:36:15 +0800 CST
  • Martin Hope
    Evan Carroll systemctl 状态显示:“状态:降级” 2018-06-03 18:48:17 +0800 CST
  • Martin Hope
    Tim 我们如何运行存储在变量中的命令? 2018-05-21 04:46:29 +0800 CST
  • Martin Hope
    Ankur S 为什么 /dev/null 是一个文件?为什么它的功能不作为一个简单的程序来实现? 2018-04-17 07:28:04 +0800 CST
  • Martin Hope
    user3191334 如何从 systemctl 服务日志中查看最新的 x 行 2018-02-07 00:14:16 +0800 CST
  • Martin Hope
    Marko Pacak Nano - 跳转到文件末尾 2018-02-01 01:53:03 +0800 CST
  • Martin Hope
    Kidburla 为什么真假这么大? 2018-01-26 12:14:47 +0800 CST
  • Martin Hope
    Christos Baziotis 在一个巨大的(70GB)、一行、文本文件中替换字符串 2017-12-30 06:58:33 +0800 CST

热门标签

linux bash debian shell-script text-processing ubuntu centos shell awk ssh

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve