在Objective-c中将短数组转换为字节数组,反之亦然,将int转换为字节数组,反之亦然

时间:2014-12-17 16:44:35

标签: objective-c int byte bytearray short

我很困惑,在Objective-C中将字节数组转换为short(反之亦然),并将int转换为字节数组,反之亦然。

我在Java中看到如下

  public static short byteArrayToShort(byte[] b) {
    if (b.length > 1) {
        return (ByteBuffer.wrap(b)).order(ByteOrder.LITTLE_ENDIAN).asShortBuffer().get();
    } else {
        return b[0];
    }
}

/**
 * Short to byte array.
 *
 * @param value the value
 * @return the byte[]
 */
public static byte[] shortToByteArray(short value) {
    return ByteBuffer.allocate(2).order(ByteOrder.LITTLE_ENDIAN).putShort(value).array();
}

/**
 * Int to byte array.
 *
 * @param value the value
 * @return the byte[]
 */
public static byte[] intToByteArray(int value) {
    return ByteBuffer.allocate(4).order(ByteOrder.LITTLE_ENDIAN).putInt(value).array();
}

/**
 * Convert the byte array to an short starting from the given offset.
 * 
 * @param b The byte array
 * @return The integer
 */
public static int byteArrayToInt(byte[] b) {
    if (b.length > 1) {
        return (ByteBuffer.wrap(b)).order(ByteOrder.LITTLE_ENDIAN).asIntBuffer().get();
    } else {
        return b[0];
    }
}

在Objective-C中,我尝试过如下操作:

//Byte to Short array
- (uint16_t*) byte2short:(uint8_t *)bytes size:(int)size{
    uint16_t*shorts = (uint16_t*)malloc(size/2);
    for (int i=0; i < size/2; i++){
       shorts[i] = (bytes[i*2+1] << 8) | bytes[i*2];
    }
    return shorts;
}
//Short to Byte array
- (uint8_t *) short2byte:(uint16_t*)shorts size:(int)size{

    uint8_t *bytes = (uint8_t *)malloc(size*2);
    for (int i = 0; i < size; i++)
    {
        bytes[i * 2] = (uint16_t) (shorts[i] & 0x00FF);
        bytes[(i * 2) + 1] = (uint16_t) (shorts[i] >> 8);
        shorts[i] = 0;
    }
    return bytes;
  }

我尝试过这样做,而且我也不知道在Objective-c中将int转换为Byte数组。

请建议我

1 个答案:

答案 0 :(得分:0)

您的代码的问题在于您假设malloc以某种方式“知道”有关正在分配的内容的大小,就像Java的数组new知道分配5之间的区别一样int和5 short s。好吧,malloc没有。除非你另有说明,否则它会分配所需的字节数。这就是你这样做的原因

uint16_t*shorts = (uint16_t*)malloc(size/2);

然后将size/2 uint16_t写入其中,超出缓冲区。

在C中(以及在Objective-C中,它是C的超集)分配基元数组的正确方法如下:

size_t count = (size+1)/2; // Do not assume that size is even
uint16_t *shorts = malloc(sizeof(uint16_t)*count);

现在你有足够的记忆力来适应你所有的短裤。

在您的其他功能中,您应该使用

uint8_t *bytes = malloc(sizeof(uint8_t)*size*2);

请注意,在两种情况下都不需要演员表。但bytes变量的类型很重要,因为这决定了在bytes[i * 2]bytes[(i * 2)+1]表达式中写入的实际地址:

for (int i = 0; i < size; i++)
{
    bytes[i * 2] = (uint8_t) (shorts[i] & 0xFF);
    bytes[(i * 2) + 1] = (uint8_t) (shorts[i] >> 8);
    shorts[i] = 0;
}