- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
这是一个检查card[]
提供的校验和的功能。已验证。 card[]
包含六对字符。前五对组成一个十六进制数,最后一对包含校验和。如果校验和等于前五对的 XOR,则校验和有效。
它工作正常,但代码很糟糕。我试图使用嵌套循环,但它不起作用。现在我从 card[]
得到双,将它们转换为数字并检查校验和是否有效。
bool checksum(char card[])
{
int a=0;
char character0[2];
char character1[2];
char character2[2];
char character3[2];
char character4[2];
char character5[2];
long n0,n1,n2,n3,n4,n5;
char card_number;
for(int i=0;i<2;i++)
{
for(a=0;a<2;a++)
{
character0[a]=card[i];
}
}
for(int i=2;i<4;i++)
{
for(a=0;a<2;a++)
{
character1[a]=card[i];
}
}
for(int i=4;i<6;i++)
{
for(a=0;a<2;a++)
{
character2[a]=card[i];
}
}
for(int i=6;i<8;i++)
{
for(a=0;a<2;a++)
{
character3[a]=card[i];
}
}
for(int i=8;i<10;i++)
{
for(a=0;a<2;a++)
{
character4[a]=card[i];
}
}
for(int i=10;i<12;i++)
{
for(a=0;a<2;a++)
{
character5[a]=card[i];
}
}
n0 = strtol(character0, NULL, 16);
n1 = strtol(character1, NULL, 16);
n2 = strtol(character2, NULL, 16);
n3 = strtol(character3, NULL, 16);
n4 = strtol(character4, NULL, 16);
n5 = strtol(character5, NULL, 16);
if(n0^n1^n2^n3^n4==n5) return true;
else return false;
}
if(n0^n1^n2^n3^n4==n5) return true;
else return false;
if((n0^n1^n2^n3^n4)==n5)) return true;
else return false;
最佳答案
使用 2D 数组而不是 6 个 1D 数组(与 character0
,character1
,...)
对 n
使用一维数组而不是 ( n0
, n1
, ...)
将 EOS 终止添加到传递给 strtol
的字符串中
这是一个重构版本:
bool
checksum(char card[])
{
char chars[6][3];
long nx[6];
for (int col = 0; col < 6; ++col) {
int lo = col << 1;
int hi = lo + 2;
for (int i = lo; i < hi; ++i)
chars[col][i - lo] = card[i];
}
for (int i = 0; i < 6; ++i) {
char *ptr = chars[i];
ptr[2] = 0;
nx[i] = strtol(ptr,NULL,16);
}
if (nx[0] ^ nx[1] ^ nx[2] ^ nx[3] ^ nx[4] == nx[5])
return true;
else
return false;
}
bool
checksum(char card[])
{
char tmp[3];
long nx[6];
tmp[2] = 0;
for (int col = 0; col < 6; ++col) {
int lo = col << 1;
tmp[0] = card[lo + 0];
tmp[1] = card[lo + 1];
nx[col] = strtol(tmp,NULL,16);
}
if (nx[0] ^ nx[1] ^ nx[2] ^ nx[3] ^ nx[4] == nx[5])
return true;
else
return false;
}
bool
checksum(char card[])
{
char tmp[3];
long nx;
tmp[2] = 0;
nx = 0;
for (int idx = 0; idx < 12; idx += 2) {
tmp[0] = card[idx + 0];
tmp[1] = card[idx + 1];
nx ^= strtol(tmp,NULL,16);
}
if (nx == 0)
return true;
else
return false;
}
v0, v1, v2, ... vN
支持数组:
v[N+1]
.这允许用循环替换复制的代码。 OP 的代码有两个这样的实例
character*
和
n*
变量,所以我将两者都转换为数组。
N
是6。所以,代码可以通过剪切和粘贴来构建。
N
如果是一个更大的数字,比如 1000,那么原始代码将无法很好地扩展。而且,阵列解决方案将变得 [更] 明显。
char
character*
形式的数组在第一个代码块中[添加一个 EOS 字符以允许
strtol
去工作]。这仍然有一个错误,因为 EOS 没有空间。
strtol
在中间
character*
产生的变量
n*
变量。
character*
[我用 2D
chars
替换了数组],可以用单个
tmp
消除大批。
if (nx[0] ^ nx[1] ^ nx[2] ^ nx[3] ^ nx[4] == nx[5])
if (nx[0] ^ nx[1] ^ nx[2] ^ nx[3] ^ (nx[4] == nx[5]))
if ((nx[0] ^ nx[1] ^ nx[2] ^ nx[3] ^ nx[4]) == nx[5])
nx
】有利于运行 CRC 的数组],基于以下标识:
(x == y) === ((x ^ y) == 0)
if (nx == 0)
return true;
else
return false;
return (nx == 0);
return
会更清楚。顺序。而且,优化器 [可能] 会为两者生成完全相同的代码。
hex
像其他人建议的那样解码单个十六进制字符的函数,调用它两次并消除复制到
tmp
并调用
strtol
,但是,再次,我觉得我离原始代码已经够远了。
unsigned int
hex(unsigned int chr)
{
// NOTE: hopefully, this function gets inlined ...
do {
if ((chr >= '0') && (chr <= '9')) {
chr -= '0';
break;
}
chr = tolower(chr);
if ((chr >= 'a') && (chr <= 'f')) {
chr -= 'a';
chr += 10;
break;
}
// should blow up here (but there was no error checking in original)
chr = 0;
} while (0);
return chr;
}
bool
checksum(const char *card,size_t len)
{
unsigned int cur;
unsigned int crc = 0;
for (size_t idx = 0; idx < len; idx += 2) {
cur = hex(card[idx + 0]);
cur <<= 4;
cur |= hex(card[idx + 1]);
crc ^= cur;
}
return (crc == 0);
}
hex
的调用支持 [single] 表查找可能会更快并提供一些错误检查:
int
checksum(const char *card,size_t len)
{
static unsigned char hex[256] = { ['0'] = 0xFF };
unsigned int chr;
unsigned int cur;
unsigned int crc = 0;
// one time init of translation table
if (hex['0'] == 0xFF) {
for (chr = 0x00; chr <= 0xFF; ++chr)
hex[chr] = 0xFF;
for (chr = 0; chr <= 9; ++chr)
hex[chr + '0'] = chr;
for (chr = 0x00; chr <= 0x05; ++chr) {
hex[chr + 'a'] = chr + 0x0A;
hex[chr + 'A'] = chr + 0x0A;
}
}
for (size_t idx = 0; idx < len; idx += 2) {
chr = hex[card[idx + 0]];
#ifdef ABORT_ON_ERROR
if (chr == 0xFF)
return -1;
#endif
cur = chr;
cur <<= 4;
chr = hex[card[idx + 1]];
#ifdef ABORT_ON_ERROR
if (chr == 0xFF)
return -1;
#endif
cur |= chr;
crc ^= cur;
}
return (crc == 0);
}
关于c - 如何使这个用于检查校验和的 C 代码更短?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59923188/
我有一个功能是转换 ADO Recordset 进入html: class function RecordsetToHtml(const rs: _Recordset): WideString; 该函
经过几天的研究和讨论,我想出了这种方法来收集访客的熵(你可以看到我的研究历史here) 当用户访问时,我运行此代码: $entropy=sha1(microtime().$pepper.$_SERVE
给定一个无序列表 List ,我需要查找是否存在 String与提供的字符串匹配。 所以,我循环 for (String k : keys) { if (Utils.keysM
我已经搜索过这个问题,但没有找到我正在寻找的答案。 基本上,我想将类构造函数包装在 try/except 子句中,以便它忽略构造函数内特定类型的错误(但无论如何都会记录并打印它们)。我发现做到这一点的
我有一组三个数字,我想将一组数字与另一组数字进行比较。即,第一组中的每个数字小于另一组中的至少一个数字。需要注意的是,第一组中的下一个数字必须小于第二组中的不同数字(即,{6,1,6} 对 {8,8,
关闭。这个问题是off-topic .它目前不接受答案。 想改进这个问题吗? Update the question所以它是on-topic用于堆栈溢出。 关闭 9 年前。 Improve this
首先介绍一下背景: 我正在开发一个带有 EJB 模块和应用程序客户端模块的企业应用程序 (ear)。我还使用 hibernate JPA 来实现持久性,并使用 swingx 来实现 GUI。这些是唯一
我正在尝试在我的上网本上运行 Eclipse 以便能够为 Android 进行开发。 您可能已经猜到了,Eclipse 非常慢,并且不容易有效地开发。 我正在使用 Linux Ubuntu 并且我还有
for row, instrument in enumerate(instruments): for col, value in enumerate(instrument):
return not a and not b ^ 我如何以更好的格式表达它 最佳答案 DeMorgan's Law , 也许? return not (a or b) 我认为在这一点上已经足够简单了
我正在尝试让 Font Awesome 图标看起来更 slim https://jsfiddle.net/cliffeee/7L6ehw9r/1/ . 我尝试使用“-webkit-text-strok
假设我有一个名为 vals 的数据框,如下所示: id…………日期…………min_date…… .........最大日期 1…………2016/01/01…………2017/01/01…………2018/
是否有更 Pythonic 的方式来做到这一点?: if self.name2info[name]['prereqs'] is None: se
我有一个函数可以将一些文本打印到它接收到的 ostream&。如果 ostream 以终端为目标,我想让它适应终端宽度,否则默认为某个值。 我现在做的是: 从 ostream 中获取一个 ofstre
这个问题在这里已经有了答案: Should a retrieval method return 'null' or throw an exception when it can't produce
我有这个 bc = 'off' if c.page == 'blog': bc = 'on' print(bc) 有没有更 Pythonic(和/或更短)的方式在 Python 中编写? 最佳
输入:一个包含 50,000 行的 CSV;每行包含 910 列值 0/1。 输出:运行我的 CNN 的数据框。 我编写了一个逐行读取 CSV 的代码。对于每一行,我将数据分成两部分,称为神经元(90
据我所知,with block 会在您退出 block 后自动调用 close(),并且它通常用于确保不会忘记关闭一个文件。 好像没有技术上的区别 with open(file, 'r+') as f
我有一个使用 Entity Framework V6.1.1 的 MVC 5 网站。 Entity Framework DbContext 类和模型最初都在网站项目中。这个项目有 3 个 DbCont
我是编程新手,在尝试通过将 tableView 和关联 View 的创建移动到单独的类并将委托(delegate)和数据源从 VC 移动到单独的类来精简我的 ViewController 时遇到了一些
我是一名优秀的程序员,十分优秀!