Java中的等效GetBytes函数,如c#

时间:2014-02-27 12:08:27

标签: c# java encoding

当我将C#库移植到Java时,我遇到了在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);

Lwft one是Java输出,右边是C#如何使Java输出与C#one相同?

enter image description here

2 个答案:

答案 0 :(得分:3)

有可能,字节数组 相同。但是,如果您将它们格式化为字符串表示形式(例如,通过调试器查看),那么它们将显示不同,因为byte数据类型在C#中被视为无符号(值0 - 255)但是用Java签名(值-128 - 127)。有关说明,请参阅this questionmy answer

修改:基于this answer,您可以使用以下方式在Java中打印无符号值:

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

答案 1 :(得分:2)

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

C#和Java之间存在很大差异:在Java中,byte 未签名

要转储,请尝试:

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

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

或者,如果转储函数涉及大于byte的整数类型,例如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)