【问题标题】:Converting ASCII string into binary to add Parity将 ASCII 字符串转换为二进制以添加奇偶校验
【发布时间】:2019-10-02 09:34:04
【问题描述】:

我正在尝试将 ASCII 字符串转换为二进制,以便我可以添加奇偶校验(汉明码)。但是输出根本不对。

如果我在输入中输入“A”,它应该返回: 01000001 我已经用'B'试过了,但它没有返回

unsigned char bits[8];
for(int i = 8; i >= 1; i--){

我希望“A”的输出为 01000001 但实际输出为 00100000 同样适用于 ABC 或 B 或 C

【问题讨论】:

  • 高位是 7,低位是 0。你的 for 循环移动太多了

标签: c


【解决方案1】:

i 减一,因此您正在访问元素 bitC[8]bitC[1](即使 bitC[8] 超出范围),并且您正在打印位 8 到 1 而不是位 7 到 0。

替换

for(int i = 8; i >= 1; i--){

for(int i = 8; i--; ){

【讨论】:

  • for(int i = 8; i--; ){ 是糟糕的黑客风格。请使用for (int i = 7; i >=0; i--) {!或者,如果您的幻数有一个常数,for (int i = BITS_PER_BYTE - 1; i >= 0; i--) {
  • @the busybee,魔术数字很糟糕,当然(但我不确定在这里使用常量是否会增加清晰度)。另一个变化是完全糟糕的。尽管。它是等效但更复杂的代码。易于阅读是好的软件的关键,因此易于阅读和易于识别的常用习语每天都比识别代码的时间更长、更难,即使新手必须花两秒钟时间学习它。
  • C 的 for 循环一开始就非常难以阅读。例如,一眼就很难看出for (int i = BITS_PER_BYTE - 1; i >= 0; i--)for (int i = BITS_PER_BYTE; i >= 0; i--)for (int i = BITS_PER_BYTE - 1; i > 0; i--)for (int i = BITS_PER_BYTE - 1; i >= 0; i--) 之间的区别。将其保持在最低限度是关键。 (通过使用多个变量或以其他一些不可能与成语混淆的方式来最大限度地利用它也是可以的。你会失去快速识别的优势,但它不会被误认为是错误的东西。 )
  • 依靠零为假是好事。并且依赖 postdecrement 返回的值也不错——它的存在实际上没有其他原因! (当我看到您无用地使用后减量的代码时,我会立即怀疑您是否犯了一个错误。糟糕!不要让读者想知道这些事情。)
  • 前减和后减返回值的原因是在 K&R-C 的黑暗时代,当时处理器能力非常低,编译器很原始。几十年来从事与安全相关的 C 项目让我有足够的理由拒绝这种骇人听闻的风格。
猜你喜欢
  • 1970-01-01
  • 2014-06-14
  • 1970-01-01
  • 2016-10-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-04-21
  • 2012-03-30
相关资源
最近更新 更多