在c#中转换为字符串到字节数组,在java中将字节数组转换为字符串

在c#中转换为字符串到字节数组,在java中将字节数组转换为字符串,java,c#,arrays,string,byte,Java,C#,Arrays,String,Byte,我有客户机-服务器设置,客户机是C语言,服务器是Java语言。 现在,我将字符串编码到字节数组中,并将其发送到Java服务器,但当Java解码时,它会收到一个字符串,每个字符后面都有一个空格: Sending PLAIN >>>>> Received P L A I N C#代码(发送方): 静态字节[]获取字节(字符串str){ byte[]bytes=Encoding.UTF8.GetBytes(str); //System.Buffer.BlockCopy

我有客户机-服务器设置,客户机是C语言,服务器是Java语言。 现在,我将字符串编码到字节数组中,并将其发送到Java服务器,但当Java解码时,它会收到一个
字符串
,每个字符后面都有一个空格:

Sending PLAIN  >>>>> Received P L A I N
C#代码(发送方):

静态字节[]获取字节(字符串str){
byte[]bytes=Encoding.UTF8.GetBytes(str);
//System.Buffer.BlockCopy(str.ToCharArray(),0,bytes,0,bytes.Length);
返回字节;
}
Java代码(接收器):

protected SaslResponse receiveSaslMessage()引发TTTransportException{
UnderlineTransport.readAll(messageHeader,0,messageHeader.length);
字节状态字节=消息头[0];
//此处接收的C#代码的字节数
byte[]有效载荷=新字节[EncodingUtils.decodeBigEndian(messageHeader,STATUS_BYTES)];
UnderlineTransport.readAll(有效载荷,0,有效载荷.长度);
NegotiationStatus状态=NegotiationStatus.byValue(statusByte);
如果(状态==null){
sendAndThrowMessage(NegotiationStatus.ERROR,“无效状态”+statusByte);
}else if(状态==NegotiationStatus.BAD | |状态==NegotiationStatus.ERROR){
试一试{
字符串remoteMessage=新字符串(有效负载,“UTF-8”);
抛出新的TTTransportException(“对等指示故障:+remoteMessage”);
}捕获(不支持的编码异常e){
抛出新的TTTransportException(e);
}
}
if(LOGGER.isDebugEnabled())
debug(getRole()+“:收到状态为{}且有效负载长度为{}的消息”,
状态、有效载荷、长度);
返回新的SaslResponse(状态、有效负载);
}
受保护的void handleSaslStartMessage()引发TTTransportException、SaslException{
//调用上限方法
SaslResponse message=receiveSaslMessage();
debug(“收到状态为{}的启动消息”,message.status);
if(message.status!=NegotiationStatus.START){
SendAndRowMessage(NegotiationStatus.ERROR,“预期启动状态,收到”+message.status);
}
//此处转换为字符串的字节-已收到P L A I N
String mechanismName=新字符串(message.payload);
TSaslServerDefinition serverDefinition=serverDefinitionMap.get(mechanismName);
debug(“收到的机制名{}”,mechanismName);
if(serverDefinition==null){
sendAndThrowMessage(NegotiationStatus.BAD,“不支持的机制类型”+机制名称);
}
SaslServer SaslServer=Sasl.createSaslServer(serverDefinition.mechanism,
serverDefinition.protocol、serverDefinition.serverName、serverDefinition.props、,
服务器定义(cbh);
设置saslServer(saslServer);
}

首先将调试添加到C代码中:

然后将其转换为Java代码:

// Bytes converted to string here - Received P L A I N
System.out.println("Base64 debug: " + new sun.misc.BASE64Encoder().encode(message.payload));
String mechanismName = new String(message.payload);
最后替换:

//String mechanismName = new String(message.payload);
String mechanismName = new String(message.payload, "UTF-8");

我认为您应该使用
UTF8
,而不是
UTF-8
字符串,即
string remoteMessage=新字符串(有效负载,“UTF8”)
是C#附加了一个
nul
字符,即
\0
?我怀疑C#是在添加它们,但它可以很容易地用hex editor进行检查?在SO和网络上有一些关于同一主题的线程,请快速搜索,如果没有帮助,请返回。这里有一个问题:每个字符后面都有空格,而不是0字符吗?您可以在发送字节数组之前将其输出(例如,输出到文件),并在接收时输出接收到的字节数组,并在十六进制编辑器中检查它们(对于ASCII字符,每个字符应为一个字节)。如果它们不同,则传输中的某些内容正在修改它。在HandleASLStartMessage中,您使用的是默认字符集。它可能是UTF-8,但如果有疑问,您可以指定它。“UTF-8”是AFAIK的正确名称。(见附件)。
//String mechanismName = new String(message.payload);
String mechanismName = new String(message.payload, "UTF-8");