什么与Java中的.Net Guid.ToByteArray()等效

什么与Java中的.Net Guid.ToByteArray()等效,java,c#,.net,Java,C#,.net,如何将Guid.ToByteArray()的以下.net用法转换为Java 返回.Net字节数组 ga= [185,242,54,152,140,186,166,66,184,132,46,158,237,159,185,90] ga= [-72,-124,46,-98,-19,-97,-71,90,-104,54,-14,-71,-70,-116,66,-90] 在Java中尝试(与.Net数组不匹配) 返回的Java字节数组 ga= [185,242,54,152,140,186,166

如何将Guid.ToByteArray()的以下.net用法转换为Java

返回.Net字节数组

ga= [185,242,54,152,140,186,166,66,184,132,46,158,237,159,185,90]
ga= [-72,-124,46,-98,-19,-97,-71,90,-104,54,-14,-71,-70,-116,66,-90]
在Java中尝试(与.Net数组不匹配)

返回的Java字节数组

ga= [185,242,54,152,140,186,166,66,184,132,46,158,237,159,185,90]
ga= [-72,-124,46,-98,-19,-97,-71,90,-104,54,-14,-71,-70,-116,66,-90]
更新w/来自的解决方案


Java中近似等价的类是。但是,正如您所注意到的,这两种方法给出的字节数组并不相同。但是,如果执行以下命令并查看Java给出的数组与.NET给出的数组:

导入java.nio.ByteBuffer;
导入java.util.array;
导入java.util.UUID;
公共班机{
//从你的问题中期待
私有静态最终int[]应为\u字节={
185, 242, 54, 152, 140, 186, 166, 66, 184, 132, 46, 158, 237, 159, 185, 90
};
公共静态void main(字符串[]args){
UUID UUID=UUID.fromString(“9836f2b9-ba8c-42a6-b884-2e9eed9fb95a”);
字节[]数组=toByteArray(uuid);
System.out.println(“预期:“+Arrays.toString(预期的_字节));
System.out.println(“实际:“+Arrays.toString(toUnsignedInts(array)));
}
专用静态字节[]toByteArray(UUID UUID){
按缓冲区返回。分配(16)
.putLong(uuid.getMostSignificantBits())
.putLong(uuid.getLeastSignificantBits())
.array();
}
//仅用于视觉目的
私有静态int[]toUnsignedInts(字节[]数组){
int[]结果=新的int[array.length];
for(int i=0;i
以及输出:

EXPECTED:[185242、54152140、186166、66184132、4615823715918590]
实际:[152、54、242、185、186、140、66、166、184、132、46、158、237、159、185、90]
你会看到数组几乎相等,只是有些字节的顺序不匹配。最后八个字节(即最低有效位)都匹配,但前四个字节反转,后两个字节反转,后两个字节也反转。要直观地看到它:

EXPECTED:[185242、54152140、186166、66184132、4615823715918590]
实际:[152、54、242、185、186、140、66、166、184、132、46、158、237、159、185、90]
|---------------|  |------|  |-----|
我不知道为什么会存在这种差异,但在回答一个问题时说:

另请参见[]“许多系统完全以大端格式对UUID进行编码。”“其他系统,尤其是Microsoft在其COM/OLE库中对UUID进行编组,使用混合端格式,其中UUID的前三个组件是小端,后两个是大端。”–12月20日19日13:06

评论中的答案为您的问题提供了解决方案,您已将其包含在问题中。该解决方案只是交换字节以获得所需的效果。下面是另一个不涉及创建拷贝阵列的解决方案:

专用静态字节[]toByteArray(UUID UUID){
long mostSigBits=uuid.getMostSignificantBits();
按缓冲区返回。分配(16)
.order(字节顺序.小字节)
.putInt((int)(mostSigBits>>32))
.putShort((short)((int)mostSigBits>>16))
.putShort((短)mostSigBits)
.order(字节顺序.BIG_ENDIAN)
.putLong(uuid.getLeastSignificantBits())
.array();
}
注意:我对位移位不太适应,因此可能有一种更简洁的方法来完成上面的操作,这是我想不到的

这将提供以下输出:

EXPECTED:[185242、54152140、186166、66184132、4615823715918590]
实际:[185242 54152140186166 66184132 4615823715918590]

警告:不幸的是,我不确定您是否可以依靠这两种解决方案在100%的时间内提供正确的字节


    • 该问题的替代解决方案-

      public static byte[] getByteArrayFromUUID(UUID uuid) {
          ByteBuffer mostSignificantBitsByteBuffer = ByteBuffer.allocate(Long.BYTES)
                  .putLong(uuid.getMostSignificantBits());
          return ByteBuffer.allocate(Long.BYTES * 2)
                  .order(ByteOrder.LITTLE_ENDIAN)
                  .putShort(mostSignificantBitsByteBuffer.getShort(2))
                  .putShort(mostSignificantBitsByteBuffer.getShort(0))
                  .putShort(mostSignificantBitsByteBuffer.getShort(4))
                  .putShort(mostSignificantBitsByteBuffer.getShort(6))
                  .order(ByteOrder.BIG_ENDIAN)
                  .putLong(uuid.getLeastSignificantBits())
                  .array();
      }
      

      请参阅,谢谢,但是我今天已经尝试了这些方法,但是字节数组字节不匹配。见上面更新的。我应该在之前展示这个=)我确信我需要改变一些愚蠢的事情。字节必须匹配才能创建一个SecretKeySpec来解密我带来的一些.Net AES加密数据。我希望有办法解决这个问题,因为我无法控制.Net AES加密端,我需要在Java端为其生成密钥=)我刚刚找到了一个解决方案,它在这里工作。字节顺序混乱。我永远也想不到这一点=)我将更新上面的问题以添加解决方案。谢谢你的帮助。
      public static byte[] getByteArrayFromUUID(UUID uuid) {
          ByteBuffer mostSignificantBitsByteBuffer = ByteBuffer.allocate(Long.BYTES)
                  .putLong(uuid.getMostSignificantBits());
          return ByteBuffer.allocate(Long.BYTES * 2)
                  .order(ByteOrder.LITTLE_ENDIAN)
                  .putShort(mostSignificantBitsByteBuffer.getShort(2))
                  .putShort(mostSignificantBitsByteBuffer.getShort(0))
                  .putShort(mostSignificantBitsByteBuffer.getShort(4))
                  .putShort(mostSignificantBitsByteBuffer.getShort(6))
                  .order(ByteOrder.BIG_ENDIAN)
                  .putLong(uuid.getLeastSignificantBits())
                  .array();
      }