【问题标题】:C- how to make a variable to be big end. by default?C-如何使变量成为大端。默认情况下?
【发布时间】:2018-11-04 18:31:56
【问题描述】:

我希望我的程序默认使用大端(现在它很小)。 这意味着,每次我声明一个 uint_32/int 时,转换为它的值都将处于大端顺序。 那可能吗? (无需每次都调用 ntohl())。

我在 google 和 s.o 上研究了 3 天,但没有任何答案 我将非常感谢任何帮助!

编辑: 我有服务器和客户端。 客户端使用大端,服务端使用小端。 现在,我将字节数组的 md5 值发送到服务器,在服务器上对其进行 ntohl() 处理并获取有效的 md5 值。

在服务器中,当我调用 md5.c 函数(顺便说一下,它是 dll)时,我得到了不同的值。 这个值在任何方面都与接收值不同。 我认为它的发生是因为字节序。 我发送给函数的字节数组没有改变,因为它们是单个字节,这不会影响字节顺序,但是我在函数上声明的变量,以及我操纵字节 arr 的变量,可能会产生问题。

这就是大端对我如此重要的原因。

【问题讨论】:

  • 请解释为什么大端序对您如此重要。所以edit你的问题来改进它
  • 为什么不能使用ntohl?为什么你认为字节顺序是问题?你没有检查这个来确认吗?

标签: c endianness


【解决方案1】:

我希望我的程序默认使用大端

你不能。 endianness 是目标处理器(您的 C 编译器)的固定属性,并与其instruction set architecture 相关。

原则上,您可以(但对于 C,这真的不值得麻烦)为某些具有适当字节序的虚拟机(如 WebAssemblyMMIX)使用 C 编译器,甚至定义字节码 VM对于所需字节序的机器。

对于某些 other 指令集架构(例如 MIPS、ARM 等),其变体可能是 cross-compile,并使用一些 emulator 来运行可执行文件(以及必要的操作系统)。

关于您的编辑,您可以考虑以字母数字形式在网络上发送md5sum(例如md5sum 命令的输出)。

【讨论】:

  • 实际上我在 c# 上有服务器,它使用 md5.c (dll) 和 c 客户端。我将我的 md5 值发送到服务器,ntoh() 处理它,但是当我用相同的输入调用 md5 值时,它会返回一个奇怪的 md5 值。我认为它的发生是因为 md5.dll 上的变量很少,所以当我用这些值操作我的输入时,它会返回不同的值。
  • 这应该进入问题,这并不能解释为什么你需要大字节序
  • 看起来@דוראיטח 有一个用于混凝土拱门的二进制编译库,并希望在其他地方重用它 ¿?
【解决方案2】:

您可以为不同的处理器编译程序,其中一些使用大端而不是小端,或者您可以控制您的代码在这方面的编译方式。例如,对于 MIPS:https://gcc.gnu.org/onlinedocs/gcc/MIPS-Options.html

【讨论】:

    【解决方案3】:

    字节顺序纯粹是关于处理器如何执行多字节算术。程序员唯一需要注意的是在序列化或寻址整数部分时。

    因此,除非您可以更改处理器对多字节字执行算术的方式(ARM 允许您更改字节顺序),否则您将被处理器的工作方式所困扰。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-10-09
      • 2010-11-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-02-29
      相关资源
      最近更新 更多