【问题标题】:Equivalent GetBytes function in Java like c#Java中的等效GetBytes函数,如c#
【发布时间】:2014-02-27 20:29:51
【问题描述】:

当我将我的 C# 库移植到它时,我在将字符串转换为 Java 中的字节时遇到了问题。它转换字符串,但它不是同一个字节数组。

我在 C# 中使用此代码

string input = "Test ěščřžýáíé 1234";
Encoding encoding = Encoding.UTF8;
byte[] data = encoding.GetBytes(input);

Java 代码

String input = "Test ěščřžýáíé 1234";
String encoding = "UTF8";
byte[] data = input.getBytes(encoding);

左一为Java输出右一为C#如何使Java输出与C#一相同?

【问题讨论】:

  • 应该是“UTF-8”(编辑:没关系——“UTF8”是别名)
  • 您可以尝试使用StandardCharsets.UTF_8 和适当的.getBytes() 方法吗?
  • Wait wait wait -- 你如何测试字节是否相同?不要忘记 C# 中的 byte 是无符号的,而在 Java 中它是 signed

标签: c# java encoding


【解决方案1】:

很可能,字节数组相同的。但是,如果您将它们格式化为字符串表示形式(例如,通过调试器查看),那么它们会出现不同,因为 byte 数据类型在 C# 中被视为无符号(具有值0255) 但使用 Java 签名(值 -128127)。说明请参考this questionmy answer

编辑:基于this answer,您可以使用以下方法在Java 中打印无符号值:

byte b = -60;
System.out.println((short)(b & 0xFF));   // output: 196

【讨论】:

  • 还有什么办法可以用 Java 无符号字节代替用 C# 签名?
  • @JanSchwar 看到我的回答;但从字面上看,你不能得到“无符号字节”。然而,一些库,比如 Guava,确实为这种情况提供了帮助。
  • 比较列表(视觉)for ( byte b : data ) System.out.println(b < 0 ? 256 + b : b);
【解决方案2】:

这些数组很可能是相同的。

C# 和 Java 之间的一个巨大差异让您感到震惊:在 Java 中,byte无符号

为了转储,试试这个:

public void dumpBytesToStdout(final byte[] array)
{
    for (final byte b: array)
        System.out.printf("%02X\n", b);
}

在 C# 中做一个等效的转储方法(不知道怎么做,我不做 C#)

或者,如果您的转储函数涉及大于字节的整数类型,例如 int,请执行以下操作:

i & 0xff

删除符号位。请注意,如果您投射字节 -1,其内容为:

1111 1111

对于一个 int,这不会给出:

0000 0000 0000 0000 0000 0000 1111 1111

但是:

1111 1111 1111 1111 1111 1111 1111 1111

即,符号位被“携带”(否则,强制转换将产生 int 值 255,而不是 -1)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-12-11
    • 1970-01-01
    • 2011-08-28
    • 1970-01-01
    • 1970-01-01
    • 2011-11-02
    • 1970-01-01
    相关资源
    最近更新 更多