【问题标题】:is java byte the same as C# byte?java字节与C#字节相同吗?
【发布时间】:2011-06-03 04:55:31
【问题描述】:

如果输入参数是字节数组 - byte[],则来自 dll 的本机方法在 java 中有效。 如果我们使用 c# 中的相同方法,它会抛出 EntryPointNotFoundException。

那是因为 java 和 c# 中的 byte[] 是不同的东西吗?如果是这样,我应该如何使用 c# 中的本机函数?

【问题讨论】:

  • C# sbyte 和 java byte 一样吗?
  • 是的,它们都以 8 位宽度签名,范围在 -128 到 127 之间

标签: c# java dll byte native


【解决方案1】:

Java 缺少无符号类型。特别是,Java 缺少无符号字节的原始类型。 Java byte 类型是有符号的,而 C# byte 是无符号的,sbyte 是有符号的。

【讨论】:

  • 学究式地,char(有些人可能会说bool)是无符号类型;-) 但除此之外,是的。非常真实。
【解决方案2】:

是不是因为java和c#中的byte[]是不同的东西?

是的。

  • Endianness:Java 在内部将事物存储为 Big Endian,而 .NET 默认为 Little Endian。
  • 有符号性: C# 字节是无符号的。 Java 字节已签名。

different results when converting int to byte array - .NET vs Java

【讨论】:

  • 呃……字节有字节序吗?
  • 首先,@pst 是正确的,字节没有字节序(根据定义)。其次,只有在数据被序列化时才能注意到字节序。在 JNI/JNA 中,字节序与执行平台中的相同。
  • 所以下一个问题是——C# sbyte 和 java byte 一样吗?
  • @elder 是的,谢谢,我只是没有想清楚措辞。
  • @pst, @elder:字节也可以有字节序,但仅在串行流式传输时(例如 RS-232)。
【解决方案3】:

本机函数的签名是什么?如何在 Java 和 C# 中声明它?

EntryPointNotFoundException 最常见的原因是函数名被弄错(尤其是如果函数是用 C++ 编写的,则为真)或拼写错误。

另一个问题来源是用于区分函数的 ANSI 和 Unicode 版本的 WinAPI 函数的“W”和“A”后缀。 .NET互操作机制可以尝试猜测函数后缀,这样可能是混淆的根源,

【讨论】:

    【解决方案4】:

    Java 字节:

    java byte:byte 数据类型是一个 8 位有符号二进制补码整数。它的最小值为 -128,最大值为 127(含)。字节数据类型可用于在大型数组中节省内存,其中内存节省实际上很重要。它们也可以用来代替 int ,它们的限制有助于澄清您的代码;变量的范围有限这一事实可以作为一种文档形式。

    more for Java Byte

    C#字节

    Byte 表示一个 8 位无符号整数,Byte 是一种不可变值类型,表示无符号整数,其值范围从 0(由 Byte.MinValue 常量表示)到 255(由 Byte.MaxValue 表示)持续的)。 .NET Framework 还包括一个带符号的 8 位整数值类型 SByte,它表示范围从 -128 到 127 的值。

    more for c# Byte

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-09-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多