标签: magic-numbers

如何在不使用幻数的情况下将文件称为SVG?

一个SVG文件基本上是一个XML文件,所以我可以使用字符串<?xml(或十六进制表示:) '3c 3f 78 6d 6c'作为一个幻数,但有一些相反的理由不这样做,如果例如有额外的空格,它可以打破这个检查.

我需要/期望检查的其他图像都是二进制文件并且具有幻数.如何在SVG不使用最终使用Python的扩展名的情况下快速检查文件是否为格式?

python xml svg file-format magic-numbers

9
推荐指数
1
解决办法
2873
查看次数

查找Magic Numbers C++

魔术数字

正整数是"魔法",当且仅当它可以通过将其重复除以2(如果它是偶数或乘以3然后如果它是奇数则加1)来减少到1.因此,例如,3是神奇的,因为3首先减少到10(3*3 + 1),然后减少到5(10/2),然后减少到16(5*3 + 1),然后减少到8(16/2) ,然后到4(8/2),然后到2(4/2),最后到1(2/2).幻数假设表明所有正整数都是魔术,或者形式上:∀x∈Z,MAGIC(x)其中MAGIC(x)是谓词"x是魔法".

我们应该开发一个C++程序来查找1到50亿的"Magic Numbers".如果正确完成,则需要80秒或更短时间.我的大约需要2个小时,我们给出的示例程序需要14天.这是我的代码,我该怎么做才能加快速度?我错过了明显的优化问题吗?

#include <iostream>
using namespace std;

bool checkMagic(unsigned long number);

int main()
{
  for(unsigned long i = 1; i <= 5000000000; i++)
  {
    if(i % 1000000 == 0)
    {
      //only print out every 1000000 numbers to keep track, but slow it down 
      //by printing out every single number
      cout<<i<<endl;
    }

    if(!checkMagic(i))
    {
      //not magic
      cout<<i<<" not a magic number"<<endl;
      break;
    }
  }
}

bool checkMagic(unsigned long number)
{
  if(number % 2 == …
Run Code Online (Sandbox Code Playgroud)

c++ magic-numbers

8
推荐指数
1
解决办法
2348
查看次数

数组中的幻数? - C++

我是一个相当新的程序员,如果这些信息很容易获得,我很抱歉,我还没有找到它.

这是我的问题:

当您使用文字数来访问数组的特定元素时,是否被视为幻数?

例如:

arrayOfNumbers[6] // Is six a magic number in this case?
Run Code Online (Sandbox Code Playgroud)

我问这个问题,因为我的一位教授坚持认为程序中的所有字面数字都是魔数.我只是使用实数访问数组的元素,而不是为每个元素使用命名常量,这将是很好的.

谢谢!

c++ magic-numbers

7
推荐指数
3
解决办法
3990
查看次数

避免在JavaScript中使用魔术数字 - 与JsHint一起使用的替代方案

现在内置于PhpStorm的JSHint检查告诉了我关于JavaScript魔术数字的信息,并且我意识到这将使更清晰的代码避免使用它们.

我试过这个:

var constants = {
    millisecs: 1000,
    secs: 60
};
Run Code Online (Sandbox Code Playgroud)

还有这个:

var constants = function () {
    this.millisecs = 1000;
    this.getMillisecs = function () {
        return this.millisecs;
    };
};
Run Code Online (Sandbox Code Playgroud)

JsHint抱怨两者.

这个答案中解决方案虽然运行正常:

var constants = (function() {
    var millisecs = 1000,
        defaultMsgsPerSecond = 60;
    this.getMillisecs = function() { return millisecs; };
    this.getDefaultMsgsPerSecond = function() { return defaultMsgsPerSecond; };
})();
Run Code Online (Sandbox Code Playgroud)

大概是因为关闭.为什么这是被接受的,而从另一个SO问题中提出的另外两个建议却不是?

编辑:虽然没有触发错误,但实际上并不起作用.如果说常量未定义则错误.JsFiddle.

澄清 - 通过"作品"我的意思是"不会触发JsHint的警告"

javascript magic-numbers

7
推荐指数
2
解决办法
4053
查看次数

来自StreamReader的原始文件字节,幻数检测

我试图区分"文本文件"和"二进制"文件,因为我实际上想忽略具有"不可读"内容的文件.

我有一个我认为是GZIP档案的文件.我想通过检测魔术数字/文件签名来忽略这种文件.如果我用Notepad ++中的Hex编辑器插件打开文件,我可以看到前三个十六进制代码1f 8b 08.

但是,如果我使用a读取文件StreamReader,我不知道如何获取原始字节..

using (var streamReader = new StreamReader(@"C:\file"))
{
    char[] buffer = new char[10];
    streamReader.Read(buffer, 0, 10);
    var s = new String(buffer);

    byte[] bytes = new byte[6];
    System.Buffer.BlockCopy(s.ToCharArray(), 0, bytes, 0, 6);
    var hex = BitConverter.ToString(bytes);

    var otherhex = BitConverter.ToString(System.Text.Encoding.UTF8.GetBytes(s.ToCharArray()));
}
Run Code Online (Sandbox Code Playgroud)

在using语句的末尾,我有以下变量值:

hex: "1F-00-FD-FF-08-00"
otherhex: "1F-EF-BF-BD-08-00-EF-BF-BD-EF-BF-BD-0A-51-02-03"
Run Code Online (Sandbox Code Playgroud)

两者都不以Notepad ++中显示的十六进制值开头.

是否可以通过读取文件的结果获取原始字节StreamReader

.net c# encoding magic-numbers .net-4.0

7
推荐指数
2
解决办法
5720
查看次数

Gradle依赖性导致错误"无效的幻数"

我在GitHub上有一个项目,我在家里的办公室工作.大约2个月,它在两台机器上运行良好.两个星期前,它停止在家用电脑上运行,但在我的工作电脑上仍能正常工作.

这是我得到的错误:

:app:shrinkDebugMultiDexComponents FAILED

FAILURE:构建因异常而失败.

  • 出了什么问题:任务执行失败':app:shrinkDebugMultiDexComponents'.java.io.IOException:无法读取[D:\ dev\gitRepo\app\android\app\build\intermediates\multi-dex\debug\allclasses.jar](无法处理类[__MACOSX/com/stripe /android/._BuildConfig.class](类中无效的幻数[51607]))
  • 尝试:使用--stacktrace选项运行以获取堆栈跟踪.使用--info或--debug选项运行以获取更多日志输出.

stripe给我错误的包是你可以在这里找到的第三方库.我将它作为我的build.gradle文件中的依赖项完全按照他们的说法列出.

compile 'com.stripe:stripe-android:+'
Run Code Online (Sandbox Code Playgroud)

我已经注释掉所有stripe与该应用程序相关的代码并且应用程序运行完全正常,所以我知道它与我如何处理该包有关.

不幸的是,我不记得我做了什么让这个停止工作.我确实认为在发生这一周之前的一周我升级了Android Studio,并花了相当多的时间来搞乱ProGuard配置.

我尝试过的:

  • master在没有进行任何ProGuard更改的分支上工作.
  • 卸载并重新安装Android Studio
  • 重新克隆git repo
  • 安装API 17(eclipse的条纹需要这个.不是Studio,但我试了一下).
  • 联系条形客户支持,但他们没有任何线索.
  • 这个堆栈溢出帖子.但是,没有任何Mac计算机触及过这个项目,也没有我个人压缩任何相关的东西stripe.
  • 从这里,将幻数从十六进制转换为ASCII.结果是我不认识的Q`.

我认为这可能与我为ProGuard所做的事情有关,但我不明白如何做.我和Proguard的工作完全不同,有一个干净的AndroidStudio安装,有一个干净的存储库克隆,当我在办公室时,项目仍然正常.

编辑

我在debugBuildType 上运行它.这些是我的3个gradle文件.第一个是整个项目,第二个是应用程序模块,第三个是本地android库模块.

项目build.gradle:buildscript {repositories {jcenter()maven {url'http: //download.crashlytics.com/maven '}} dependencies {classpath'com.android.tools.build:grad:1.2.3'classpath'com.crashlytics .tools.gradle:crashlytics-gradle:1.+'}}

allprojects {
    repositories {
        jcenter()
        maven{ url 'http://download.crashlytics.com/maven' }
    }
}
Run Code Online (Sandbox Code Playgroud)

Android应用程序模块 build.gradle

buildscript {
    repositories {
        maven { …
Run Code Online (Sandbox Code Playgroud)

git android magic-numbers proguard gradle

7
推荐指数
1
解决办法
1217
查看次数

JavaScript舍入函数中的硬编码8191 10485值

我在一些遗留代码中看到了以下(奇怪的)Javascript舍入函数.谷歌搜索后,我可以看到它在网上很多地方出现.但是我无法弄清楚为什么存在硬编码值8191和10485.

有谁知道为什么这些价值被包括在内有任何合理的理由?如果没有,希望我们可以杀死模因!

function roundNumber(num,dec) {
    var newnumber = 0;
    if (num > 8191 && num < 10485) {
        num = num-5000;
        newnumber = Math.round(num*Math.pow(10,dec))/Math.pow(10,dec);
        newnumber = newnumber+5000;
    } else {
        newnumber = Math.round(num*Math.pow(10,dec))/Math.pow(10,dec);
    }
    return newnumber;
}
Run Code Online (Sandbox Code Playgroud)

javascript magic-numbers rounding

6
推荐指数
1
解决办法
268
查看次数

重构CSS以消除"神奇数字"

我知道魔术数字是坏的,但我仍然遇到它们似乎不可避免的时代.我创造了一个例子,我喜欢有人向我展示如何重构和消除神奇的数字.

希望这将有助于我对将来消除它们有不同的看法.

我在CodePen上的例子:http://codepen.io/kevinsperrine/pen/LiGlb

编辑:css文件的第51行包含"幻数".

top: -42px; 
Run Code Online (Sandbox Code Playgroud)

编辑2:试图澄清我在问什么:WordPress的风格指南定义了一个CSS幻数作为一次性使用的数字来"修复"(读取:创可贴)一个问题.我要求更多关于如何更改HTML和CSS甚至不需要使用-42px.根据我的经验,似乎这些类型的问题经常出现在Web开发中,所以我以这个案例为例,希望比我更有经验的人可以重构代码,这样就不需要"神奇的数字"了.

html css refactoring magic-numbers

6
推荐指数
1
解决办法
2063
查看次数

0xfbad8001回溯中的幻数

我正在查看我在GDB中调试的程序的以下回溯:

Thread 7 (Thread 3983):
#0  0xf7737430 in __kernel_vsyscall ()
#1  0x41b85412 in __lll_lock_wait () at ../nptl/sysdeps/unix/sysv/linux/i386/i486/lowlevellock.S:142
#2  0x41b80d6d in _L_lock_686 () from libpthread.so.0
#3  0xfbad8001 in ?? ()
#4  0x080eac80 in ?? ()
Backtrace stopped: previous frame inner to this frame (corrupt stack?)
Run Code Online (Sandbox Code Playgroud)

特别是我对0xfbad8001的帧地址及其含义感兴趣.

该平台基于x86,因此该未对齐地址无效.鉴于"坏"被编码为十六进制值,我猜这是一个神奇的数字,但到目前为止,我还无法确定是谁设置了这个值或为什么.我试图在谷歌和在线LXR数据库中搜索内核和glibc,但是没有发现任何实际设置此值的代码行.

如果我谷歌搜索"fbad8001",那么有许多点击在回溯和内存转储中显示此地址.所以这个特殊值似乎有一些意义,我假设它是某个地方的神奇数字,但到目前为止我还没能找到设置它的代码.

谁设定了这个值,它意味着什么?

内核基于Linux 3.4.10,glibc为2.15.


除了内核和glibc源代码外,我还通过gcc,gdb和binutils源代码,但仍然没有看到任何吸烟枪.我不知道还能在哪里看.

c debugging gdb magic-numbers backtrace

6
推荐指数
1
解决办法
458
查看次数

设计以防止魔术数字和字符串

我正在构建一个从第三方检索并提交给第三方的服务.第三方提供了一个复杂的数据模型,其中包括三种不同的状态类型,所有这些类型的整数都有一个模糊的数字序列.下面提供了一个示例(键:值):

HandlerStatus          CustomerStatus   ArchiveStatus
---                    ---              ---
activeUnallocated:40   draftOpen:0      openOpen:0      
activeAllocated:26     submitted:2      closed:1
activePromoted:102     approved:100
Declined:2             declined:1
...                    ...

只有有限数量的组合,每个组合都有一个术语(提交,委托给另一个用户,等待确认等).例如:

Combination called "Submitted":
HandlerStatus has to be "activeUnallocated" (40)
CustomerStatus has to be "submitted" (2)
ArchiveStatus has to be "openOpen" (0)

我们可以期待添加其他值,并且用户友好名称可能会随时间而变化.
此外,还有一些操作,例如提交和委托给不需要用户选择新值的其他用户,这意味着服务需要知道在这些操作发生时必须设置的一组组合.

  • 我必须能够为每种状态类型中的每个状态值定义用户友好的显示名称
  • 我必须能够从用户接收新的状态值并映射正确的状态类型
  • 我必须能够查找定义组合的值
  • 我必须能够根据一组状态值查找定义的组合


我想到了三种不同的解决方案,各有利弊.

1.为每种状态类型定义en enum

优点:

  • 强类型
  • 维护仅限于一个文件

缺点:

  • 枚举
  • UI表示的字符串格式


2.在外部JSON文件中定义键/值对

优点:

  • 添加不需要更改代码
  • 可以在运行时更新

缺点:

  • 需要魔术字符串/数字用于具有相关组合的动作(没有用户输入的动作)
  • 经常从文件系统中读取


3.为不同的可用状态组合创建代理类

优点:

  • 强类型
  • 灵活

缺点:

  • 在第三方系统中发生更改时需要代码维护


我已经尝试研究最佳实践和模式,以确定哪种解决方案最适合,可维护性和良好的代码设计,但我没有得到任何地方(同时我在开发过程中严重依赖魔术字符串和数字) ).

c# enums proxy-classes magic-numbers

6
推荐指数
1
解决办法
990
查看次数